0

有课

class Cow{
    char name[20];
    char* hobby;
    double weight;
public:
    [..]
    Cow & operator=(const Cow &c);
    [..]
};

我想知道如何编写operator=方法的定义。我写的定义等于 -

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

但是,如果已经创建了名称[20],例如“Philip Maciejowsky”并且我对它“Adam”进行了 strncpy,该怎么办。在 operator=(...) 之后将名称等于“adamlip Maciejowsky”吗?如果它像那样覆盖如何修复它?

4

2 回答 2

1

在使用 . 之后使用strcpy()或添加空终止符strncpy()strncpy()不添加空终止符 ( \0),其中一样strcpy()

我的建议:使用std::string而不是以c-styled空字符结尾的字符串。

在罗马时,做罗马人!


来自http://cplusplus.com

如果 source 长于 >num,则不会在目标末尾隐式附加空字符(因此,在这种情况下,目标可能不是以空字符结尾的 C 字符串)。

由于Adam长度小于Philip Maciejowsky-strncpy()将不会用 . 填充剩余的目的地(即Philip Maciejowsky\0。因此输出看起来像:

Adamip Maciejowsky-strcpy()或者做memset(destination, 0, lengthOfDestination)然后调用strncpy()也会导致你的输出Adam。多种方式来做你想做的事。

于 2013-03-08T23:23:27.287 回答
0

首先,如果您使用的是 C++,则不应使用 C 风格的字符串,而应使用 std::string 类,这在各方面都使一切变得更容易。

假设您需要使用 char* 字符串,strncpy 会处理这个问题。C 风格的字符串以空值结尾,这意味着诸如此类的字符串"test"占用五个字节。字节按顺序是{'t', 'e', 's', t', 0}. 零(或空)字节用作已到达字符串末尾的标记。

从我系统上 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字符串函数在读取第一个 null 时将停止处理(因为,请记住,对于 C 风格的字符串,如果不扫描字符串,就无法知道字符串的长度\0)。

于 2013-03-08T23:24:04.667 回答