【问题标题】:strncpy to already created char []strncpy 到已经创建的 char []
【发布时间】:2013-03-08 23:20:25
【问题描述】:

有课

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”进行了字符串处理,该怎么办。在 operator=(...) 之后将名称等于“adamlip Maciejowsky”吗? 如果它被这样覆盖如何修复它?

【问题讨论】:

  • 顺便说一句,你忘了复制hobby
  • 哈哈,你好担心 :) 好眼力
  • char name[20]; - 不,不在 C++ 中。如果这不是家庭作业,请将其更改为 std::string 并对 char *hobby 执行相同操作
  • Stephen Pratta 的 C++ Primer Plus 练习。我相信他知道如何教我 C++

标签: c++ class char strncpy


【解决方案1】:

使用strcpy() 或在使用strncpy() 后添加空终止符。 strncpy() 不会添加空终止符 (\0),而 strcpy() 会添加。

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

在罗马时,做罗马人!


来自http://cplusplus.com

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

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

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

【讨论】:

  • 或者如果可能的话,使用 std::string 而不是旧的 C 风格处理。
  • 我会这样做@suspectus。因为 OP 想了解 C 风格的字符串,。但我总是说“在罗马,做罗马人”
  • 在我的机器上,strncpy 的联机帮助页说它会将要复制到的数组的其余部分填充为空。
  • @medgno 这是非标准行为。标准说strncpy() 不应该 nullterminate
  • 来自 Cplusplus.com:如果 source 长于 num,则不会在目标末尾隐式附加空字符(因此,在这种情况下,目标可能不是以空结尾的 C 字符串)。
【解决方案2】:

首先,如果你使用的是 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,就无法知道字符串的长度)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    相关资源
    最近更新 更多