C++:strcat() 是否覆盖或移动空值



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

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

现在,

正如您所看到的,字符串中唯一的空值最初是在"一"之后,现在它在"一二"之后

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

还是一开始已经存在的空值又移回了结尾?

(这个问题似乎没有区别,但我想了解我学到的一切)

谢谢

第一个

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

尽管这个问题已经得到了正确和反复的回答,但从来源™获得最官方的答案可能会很好。或者至少从我可以通过谷歌找到的来源。

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

C++ 标准库提供来自 C 的 209 个标准函数 图书馆[包括STRCAT]。 --"标准 C 库",C.2.7,第 811 页

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

strcat函数追加由 s2 指向的字符串的副本 (包括终止空字符)到字符串末尾 s1指出。s2的初始字符将覆盖空值 s1结尾的人物 .如果在对象之间进行复制 重叠,行为是未定义的。

-

-"strcat函数",7.21.3.1,第327页

strcat 确实会覆盖空字符。

是的,要strcat的第一个参数的被覆盖,它成为串联字符串的最后一个字符。

它不会这样移动,该函数只是追加串联字符串的最后一个字符。

确定的唯一

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

不过,这真的很吹毛求疵,无论使用哪种方法,您都无法检测到输出的差异。

最新更新