Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串未通过构造函数参数_C++_String_Arguments - Fatal编程技术网

C++ 字符串未通过构造函数参数

C++ 字符串未通过构造函数参数,c++,string,arguments,C++,String,Arguments,名称未显示字符串。。 不确定是什么问题,但想解决。。请帮忙 Roll No : 60 Name : Percentage : 25.25 不会复制字符串。它只需将一个字符从b复制到name,特别是索引15处的字符。事实上,这实际上是未定义的行为,因为每个数组只有索引0..14。试试这个: name[15] = b[15]; 如果不理解原始指针,则不应使用它们,而应使用std::string。无论如何,您的构造函数可以按如下方式修复: strcpy(name, b); 当strlen返回的

名称未显示字符串。。 不确定是什么问题,但想解决。。请帮忙

Roll No : 60
Name : 
Percentage : 25.25
不会复制字符串。它只需将一个字符从b复制到name,特别是索引15处的字符。事实上,这实际上是未定义的行为,因为每个数组只有索引0..14。试试这个:

name[15] = b[15];

如果不理解原始指针,则不应使用它们,而应使用std::string。无论如何,您的构造函数可以按如下方式修复:

strcpy(name, b);
当strlen返回的字符串长度和b指向的\0终止符的长度等于或大于名称的大小时,strncpy存在问题-它不会将\0终止符放入目标字符串中。因此,通过这种方式,代码可能更安全:

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

同样,使用原始指针非常复杂,您需要深入了解编写安全代码的过程。使用STD::C++中的字符串将使你的生活变得简单很多。

< P>而不是无效语句

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标准函数strcpy

name[15] = b[15];
另外,构造函数的正确声明如下所示

std::strcpy( name, b );

这三个声明声明了相同的函数

为了使构造函数安全,我将其定义为

student(int a, const char *b, float c);
另外,最好使用枚举数或静态常量为幻数15指定一个名称。

当您声明

student(int a, const char b[], float c){
        roll_no = a;
        std::strncpy( name, b, 15 );
        name[14] = '\0';
        per = c;
}
name是一个15个字符的数组。参数b是指向15个字符数组的指针。声明

char name[15];
仅将b指向的数组的第16个元素复制到数组名称计数中的第16个元素,从零开始,因为数组中有15个元素,所以这里没有定义的行为,与打印名称时的方式相同[15]

在C语言中,你必须一个接一个地复制每个字符。strcpy之类的函数为您解决了这一问题,若目的地不够大,无法容纳源,那个么它可能是不安全的。 在C++中,你应该尽量避免使用char数组,而使用STD::String代替安全地获取拷贝。 您还应该使用初始值设定项列出初始化构造函数中成员的语法。例如:

name[15] = b[15];

注意:include不是标准的C/C++,它是一个特定的MS-DOS标头。尽可能避免:

这应该是一条评论。不管是什么问题,它都无法回答。@0x499602D2该问题是由于在不了解C样式字符串的工作原理时使用C样式字符串引起的。改用C++风格的字符串,就不会有这个问题。是一个有效的答案,除非/直到OP澄清出于某种原因需要字符数组。这就是这个答案的大致内容。你形成答案的方式实际上并没有回答这个问题。如果您试图提出建议,您需要将其作为评论发布。@0x499602D2,您是对的,我更新了,但我没有撰写以前的评论。顺便说一句,你必须有50个声誉才能发表评论,这让我别无选择:@0x499602D2对,很抱歉造成混淆,我不是开玩笑,我只是发表评论,因为我认为在编辑之前它已经是一个有效的答案。不过,后面还有一个更好的当B[]比SIZOFFARS字符包括它的Nulchar终止符长时,你可能想考虑这是什么名字。我会帮你省去悬念;它不终止name[]。任何将来使用它的字符串扫描库函数,如strcpy、strlen、strcmp等,都将调用未定义的行为来搜索所述终止符。@WhozCraig,谢谢,添加了更安全的变体,我认为应该有另一个始终将终止符放入目标的strncpy变体。
student(int a, const char b[], float c){
        roll_no = a;
        std::strncpy( name, b, 15 );
        name[14] = '\0';
        per = c;
}
char name[15];
name[15] = b[15];
#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;
}