【问题标题】:C++: Does strcat() overwrite or move the null?C++:strcat() 是否覆盖或移动空值?
【发布时间】:2012-08-03 19:12:28
【问题描述】:

现在让我们看看这个小程序

char s[20]="One";
strcat(s,"Two");
cout<<s<<endl;

这里最初 s 的值为“One”,对于视觉表示,这是 s 的值:

O - n - e - \0

然后我将“Two”添加到字符串的末尾,从而产生:

O - n - e - T - w - o - \0

现在你可以看到字符串中唯一的 null 最初是在 "One" 之后,现在它在 "OneTwo" 之后

我的问题是: null 是否被字符串“Two”覆盖,然后在末尾添加自己的 null。

或者是一开始就已经存在的 null 又移回到了末尾?

(这个问题似乎没什么区别,但我想知道我学到的一切)

谢谢

【问题讨论】:

  • 如果您使用的是 C++,则不需要strcat。使用std::string+=

标签: c++ character-arrays


【解决方案1】:

第一个\0 被覆盖,并在连接字符串的末尾添加一个新的\0。这里没有“移动”任何东西的余地。这些是分配值的位置。

【讨论】:

    【解决方案2】:

    尽管该问题已得到正确且重复的回答,但最好从源头获得最官方的答案™。或者至少来自我可以在 Google 上找到的来源。

    This document,声称是 C++ 标准(或其工作草案),它说:

    C++ 标准库提供了来自 C 语言的 209 个标准函数 库 [包括 strcat]。 --“标准 C 库”,C.2.7,第 811 页

    跳转到this document自称是C国际标准,我们看到:

    strcat 函数附加了s2 指向的字符串的副本 (包括终止空字符)到字符串的末尾 由s1 指向。 s2 的首字母覆盖空 s1 末尾的字符。如果复制发生在对象之间 重叠,行为未定义。

    --“strcat 函数”,7.21.3.1,第 327 页

    strcat 确实会覆盖空字符。

    【讨论】:

      【解决方案3】:

      是的,strcat 的第一个参数的\0 被覆盖,它成为连接字符串的最后一个字符。

      它不会移动,函数只是追加\0作为连接字符串的最后一个字符。 p>

      【讨论】:

        【解决方案4】:

        确定的唯一方法是查看您特定版本的strcat 的来源。典型的实现会覆盖第一个 null 并将第二个字符串中的 null 复制到最后一个位置。

        虽然这真的很挑剔,但无论使用哪种方法,您都无法检测到输出中的差异。

        【讨论】:

          猜你喜欢
          • 2022-01-21
          • 2017-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-07
          • 2013-09-17
          • 2012-02-05
          相关资源
          最近更新 更多