strncpy已经创建了char []

时间:2013-03-08 23:20:25

标签: c++ class char strncpy

有课

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”相似并且我对它“亚当”的描述。在operator =(...)之后命名等于“adamlip Maciejowsky”? 如果它覆盖那么如何解决?

2 个答案:

答案 0 :(得分:1)

使用strcpy()或使用strncpy()后添加空终止符。 strncpy()不会添加空终结符(\0),其中strcpy()会这样做。

我的建议:使用std::string代替c-styled null终止字符串。

  

在罗马时,做罗马人!


来自http://cplusplus.com

  

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

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

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

答案 1 :(得分: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表示空字节。字符串函数在读取第一个空值时将停止处理(因为,请记住,使用C风格的字符串,没有办法知道字符串的长度而不扫描它,寻找\0)。