C++:strcat()是否会覆盖或移动null?

Moh*_*bil 6 c++ character-arrays

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

char s[20]="One";
strcat(s,"Two");
cout<<s<<endl;
Run Code Online (Sandbox Code Playgroud)

这里首先s的值为"One",对于直观表示,这是s的值:

O - n - e - \0

然后我在字符串的末尾添加"Two",产生这个:

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

现在你可以看到字符串中唯一的空值是在"One"之后,现在是在"OneTwo"之后

我的问题是:null是否被字符串"Two"覆盖,然后它在结尾处添加了它自己的null.

或者在开始时已经存在的空值又回到了最后?

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

谢谢

jua*_*nza 12

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


Kev*_*vin 5

尽管这个问题已经被多次正确回答,但从源\xe2\x84\xa2 获得最官方的答案可能会很好。或者至少从我可以通过谷歌找到的来源。

\n\n

这份文件声称是 C++ 标准(或其工作草案),内容如下:

\n\n
\n

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

\n
\n\n

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

\n\n
\n

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

\n\n

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

\n
\n\n

strcat 确实会覆盖空字符。

\n