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

时间:2012-08-06 19:29:35

标签: c++ character-arrays

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

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。

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

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

谢谢

4 个答案:

答案 0 :(得分:12)

第一个\0被覆盖,并且在连接字符串的末尾添加了新的\0。没有移动的范围&#34;这里有什么。这些是分配值的位置。

答案 1 :(得分:4)

尽管问题已得到正确和反复的回答,但从source™获得最正式的答案可能会很好。或者至少从谷歌可以找到的来源。

声称是C ++标准(或其工作草案)的

This document说:

  

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

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

  

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

     

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

strcat确实会覆盖空字符。

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

尽管如此,无论使用哪种方法,您都无法检测到输出的差异。