C程序的输出混淆两个字符串

时间:2018-10-25 06:36:28

标签: c output concatenation string-concatenation

这是我的将string2附加到字符串1的代码。当我添加以下行时,代码工作正常:s1[null_index]='\0'; 但是当我省略它时,会在输出中再加上一个“路”一词...为什么呢?为什么我必须指定null_index variabe的最终值为'\0' ....计算机应该不知道这一点,因为当我在开始声明和赋值时就知道了吗?

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
int main()
{
char s2[]="a lonely road";
char s1[]="Success is ";
    int l=strlen(s1);
    int null_index=l,i=0;
while(s2[i]!='\0')
{

s1[null_index]=s2[i];
i++;
null_index++;
}
s1[null_index]='\0'; 
printf("%s",s1);
}

3 个答案:

答案 0 :(得分:2)

s1仅分配Success is所需的内存,并且当您尝试执行s1[null_index]=s2[i];时,会导致未定义的行为。

答案 1 :(得分:2)

开始
char s2[]="a lonely road";
char s1[]="Success is ";

将声明大小为14的s2和大小为12的s1,因此,当您向s1写超过12个字符时,您将调用未定义的行为。

更改为。

char s1[100]="Success is ";

回答您的问题。

c中,字符串为null(\0),由定义终止。因此printf将在提供的字符串中寻找\0,以终止string的打印。

如果string不包含\0字符,它将继续打印字符,直到找到一个最终调用未定义行为的字符。

答案 2 :(得分:1)

问题是您拥有的数组大小固定。一旦初始化,除空终止符之外的所有索引都将超出范围,并导致undefined behavior

如果要追加到s1,则需要显式设置数组的大小,该大小适合两个字符串(加上终止符)。

当您附加到s1时,循环的第一次迭代将覆盖终止符。由于您随后不从s2复制终止符,因此必须在适当的位置显式设置s1的终止符。