簡體   English   中英

字符串未通過構造函數參數傳遞

[英]String is not passing through constructor argument

#include<iostream>
using namespace std;
#include<conio.h>

class student{
    int roll_no;
    char name[15];
    float per;
public:
    student(int a, char b[15], float c){
        roll_no = a;
        name[15] = b[15];
        per = c;
    }
    ~student(void){
        cout << "Student Details : \n\n"
             << "Roll No : " << roll_no << "\n"
             << "Name : " << name[15] << "\n"
             << "Percentage : " << per << endl;
    }
};

int main(){
    student s(60,"Suraj Jadhav",25.25);
    getch();
    return 0;
}

輸出是:學生詳細信息:

Roll No : 60
Name : 
Percentage : 25.25

名稱未顯示字符串。.不確定是什么問題,但想解決..請幫助..

當你聲明

char name[15];

名稱是15個字符的數組。 參數b是一個指針(“預期”指向15個字符的數組)。 該聲明

name[15] = b[15];

僅將“ b”指向的數組的第16個元素復制到“名稱”數組中的第16個元素(計數從零開始),因為數組中有15個元素,所以此處沒有定義的行為(使用相同的方式打印名稱[15])。

在C語言中,您必須一個接一個地復制每個字符。 諸如strcpy之類的功能會為您解決這些問題,如果目標的大小不足以容納源代碼,則這可能是不安全的。 在C ++中,您應嘗試避免使用char數組,而應使用std :: string,而take安全地進行復制。 您還應該使用初始化程序列表(用於初始化構造函數中成員的語法)。 例如:

#include<iostream>
using namespace std;
#include<conio.h>

class student{
    int roll_no;
    string name;
    float per;
public:
    student(int a, const string &b, float c) 
         : roll_no(a), name(b), per(c)
    {
    }
    ~student(){
        cout << "Student Details : \n\n"
             << "Roll No : " << roll_no << "\n"
             << "Name : " << name << "\n"
             << "Percentage : " << per << endl;
    }
};

int main(){
    student s(60,"Suraj Jadhav",25.25);
    getch();
    return 0;
}

注意: #include <conio.h>不是標准的C / C ++,它是特定的MS-DOS標頭。 盡量避免:)

name[15] = b[15];

不會復制字符串。 它將僅從b復制一個字符到name ,特別是索引15的那個字符。(實際上,這實際上是未定義的行為,因為每個數組僅具有索引0..14。)嘗試以下操作:

strcpy(name, b);

如果您不理解原始指針,則不應使用它們,而應使用std :: string。 無論如何,您的構造函數可以像這樣固定:

student(int a, const char *b, float c){
    roll_no = a;
    strncpy( name, b, sizeof( name ) );
    per = c;
}

當b指向的字符串長度等於或大於name大小時,字符串長度( strlen()返回的內容,但不包括\\ 0終止符)存在strncpy()問題-不會將\\ 0終止符放入目標字符串中。 因此,這樣可以使代碼更安全:

student(int a, const char *b, float c){
    roll_no = a;
    name[ sizeof( name ) - 1 ] = 0;
    strncpy( name, b, sizeof( name ) - 1 );
    per = c;
}

同樣,使用原始指針非常復雜,您需要深入了解編寫安全代碼的過程。 在C ++中使用std :: string將使您的生活變得更加簡單。

代替無效的陳述

name[15] = b[15];

您應該使用標頭中聲明的C標准函數strcpy

std::strcpy( name, b );

同樣,構造函數的正確聲明將如下所示

student(int a, const char b[15], float c);

要么

student(int a, const char b[], float c);

要么

student(int a, const char *b, float c);

這三個聲明聲明了相同的功能。

為了使構造函數安全,我將其定義為

student(int a, const char b[], float c){
        roll_no = a;
        std::strncpy( name, b, 15 );
        name[14] = '\0';
        per = c;
}

同樣,使用枚舉器或靜態常量為魔術數字15分配名稱也是個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM