现在让我们看看这个小程序
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
现在你可以看到字符串中唯一的空值是在“One”之后,现在是在“OneTwo”之后
我的问题是: 是否由字符串“Two”覆盖null,然后在结尾添加它自己的null。
或者在开头已经存在的空值又回到了最后?
(这个问题似乎没有什么区别,但我想知道我学到的一切)
谢谢
答案 0 :(得分:12)
第一个\0
被覆盖,并且在连接字符串的末尾添加了新的\0
。没有移动的范围&#34;这里有什么。这些是分配值的位置。
答案 1 :(得分:4)
尽管问题已得到正确和反复的回答,但从source™获得最正式的答案可能会很好。或者至少从谷歌可以找到的来源。
声称是C ++标准(或其工作草案)的C ++标准库提供了来自C的209个标准函数 库[包括strcat]。 - “标准C库”,C.2.7,第811页
跳到this document声称自己是C国际标准,我们看到:
strcat
函数附加s2
指向的字符串的副本 (包括终止空字符)到字符串的结尾 由s1
指出。s2
的初始字符会覆盖nulls1
末尾的字符。如果在对象之间进行复制 重叠,行为未定义。- “
strcat
函数”,7.21.3.1,第327页
strcat确实会覆盖空字符。
答案 2 :(得分:2)
是的,\0
的第一个参数的strcat
被覆盖,它成为连接字符串的最后一个字符。
它不会移动,只是附加 \0
的函数作为连接字符串的最后一个字符。
答案 3 :(得分:2)
唯一可以确定的方法是查看特定版本strcat
的来源。典型的实现将覆盖第一个null并将null从第二个字符串复制到最后一个位置。
尽管如此,无论使用哪种方法,您都无法检测到输出的差异。