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
),其中as
strcpy()
添加空终止符

我的建议是:使用
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++