[英]confusion in output of C program for concatenation of two strings
因此,这是我将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);
}
分配给s1
内存仅为Success is
所需的内存,并且当您尝试执行s1[null_index]=s2[i];
您正在引发未定义的行为。
首先
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
字符,它将继续打印字符,直到找到一个最终调用未定义行为的字符为止。
问题是您拥有的数组大小固定。 初始化后,任何超出null终止符的索引都将超出范围并导致未定义的行为 。
如果要追加到s1
则需要显式设置数组的大小,该大小适合两个字符串(加上终止符)。
当附加到s1
,循环的第一个迭代将覆盖终止符。 由于您随后不从s2
复制终止符,因此必须在适当的位置显式设置s1
终止符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.