用于连接两个字符串的 C 程序输出的混淆

confusion in output of C program for concatenation of two strings

所以这是我将字符串 2 附加到字符串 1 的代码。当我添加以下行时,代码工作正常:s1[null_index]='[=11=]'; 但是当我省略它时,它会在输出中再添加一次 'road' 这个词……这是为什么?为什么我必须指定 null_index 变量的最终值是 '[=12=]'... 计算机不应该已经知道这一点,因为它在我一开始声明和分配时就已经知道了吗?

#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]!='[=10=]')
{

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

问题是您拥有的数组的大小是固定的。初始化后,任何超出空终止符的索引都将越界并导致 undefined behavior.

如果你想追加到 s1 那么你需要明确设置数组的大小,一个适合两个字符串(加上终止符)的大小。

当您追加到 s1 时,循环的第一次迭代会覆盖终止符。由于您不从 s2 复制终止符,因此您必须在适当的位置明确设置 s1 的终止符。

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

开始于

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

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

改成。

char s1[100]="Success is ";

回答你的问题。

c 中,字符串按定义为 null([=16=]) 终止。因此 printf 将在提供的字符串中查找 [=16=] 以终止 string.

的打印

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