这是我的将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);
}
答案 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
的终止符。