6

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

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。

还是一开始就已经存在的空值又移回到了最后?

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

谢谢

4

4 回答 4

12

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

于 2012-08-06T19:31:41.037 回答
4

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

这份声称是 C++ 标准(或其工作草案)的文档说:

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

跳转到这个声称是 C 国际标准的文档,我们看到:

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

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

strcat 确实会覆盖空字符。

于 2012-08-06T20:02:08.220 回答
2

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

不过,这确实很挑剔,无论使用哪种方法,您都无法检测到输出中的差异。

于 2012-08-06T19:34:16.673 回答
2

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

它不会这样移动,该函数只是作为连接字符串的最后一个字符附加。 \0

于 2012-08-06T19:31:22.717 回答