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;
}