繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM