C++ strncpy到已创建的字符[]
有课C++ strncpy到已创建的字符[],c++,class,char,strncpy,C++,Class,Char,Strncpy,有课 class Cow{ char name[20]; char* hobby; double weight; public: [..] Cow & operator=(const Cow &c); [..] }; 我想知道如何编写操作符=方法的定义。 我写的定义等于—— Cow & Cow::operator=(const Cow &c){ if(this==&c) return
class Cow{
char name[20];
char* hobby;
double weight;
public:
[..]
Cow & operator=(const Cow &c);
[..]
};
我想知道如何编写操作符=
方法的定义。
我写的定义等于——
Cow & Cow::operator=(const Cow &c){
if(this==&c)
return *this;
delete [] hobby;
hobby=new char [strlen(c.hobby)+1];
weight=c.weight;
strncpy(name,c.name,20);
return *this;
}
但如果已经有了一个像“Philip Maciejowsky”这样的名字[20],而我把它改成了“Adam”,那该怎么办呢。运算符=(…)之后的名称是否等于“adamlip Maciejowsky”?
如果这样覆盖,如何修复它?使用strcpy()
或在使用strncpy()
后添加空终止符strncpy()
不添加空终止符(\0
),其中asstrcpy()
添加空终止符
我的建议是:使用std::string
而不是c-styled
null结尾的字符串
在罗马的时候,罗马人也一样
从 如果源长度大于>num(因此,在这种情况下,目标可能不是以null结尾的C字符串),则不会在目标的末尾隐式追加null字符 由于
Adam
的长度小于Philip Maciejowsky
,strncpy()
不会用\0
填充剩余的目的地(即Philip Maciejowsky
)。因此,输出如下所示:
Adamip Maciejowsky
-strcpy()
或执行memset(destination,0,lengthofdestation)
然后调用strncpy()
也将导致输出为Adam
。首先,如果你使用C++,你不应该使用C风格字符串,而应该使用类STD::string,这使得每一个方面都变得更容易。
假设您需要使用char*字符串,strncpy会处理这个问题。C样式的字符串以null结尾,这意味着像“test”
这样的字符串占用五个字节。字节的顺序是{t',e',s',t',0}。零(或null)字节用作已到达字符串结尾的标记
从我的系统上的strncpy手册页:
以下内容将chararray设置为abc\0\0\0
:
char chararray[6];
(void)strncpy(chararray, "abc", sizeof(chararray));
这意味着字符串将包含
“adam\0\0\0\0\0\0\0[etc.]”
,其中\0
表示空字节。字符串函数在读取第一个空值时将停止处理(请记住,对于C样式的字符串,如果不在字符串中搜索\0
),就无法知道字符串的长度)。或者如果可能,使用std::String而不是旧的C样式处理。这就是我在suspectus中的做法。因为OP想了解C样式的字符串。但是我总是在我的机器上说“当在罗马时,做罗马人”,strncpy的主页上说它null填充了它要复制到的数组的其余部分。@medgno这是非标准行为。该标准规定,strncpy()
不应为Cplusplus.com的null terminaterfrom:source大于num时,在destination的末尾不会隐式追加null字符(因此,在这种情况下,destination可能不是以null结尾的C字符串)。顺便说一句,您忘了复制hobby
。哈哈,你太担心了:)好眼力charname[20]代码> -不,不是C++。如果这不是家庭作业,请将其更改为std::string
,并对Stephen Pratta excercise的char*hobby
C++Primer Plus进行同样的操作。我相信他知道怎么教我C++