串接两个字符串时C程序输出的混乱

串接两个字符串时C程序输出的混乱,c,output,concatenation,string-concatenation,C,Output,Concatenation,String Concatenation,这是我将string2附加到string1的代码。当我添加以下行时,代码工作正常:s1[null_index]='\0' 但是当我省略它时,它会在输出中再添加一次“road”这个词……为什么?为什么我必须指定null_index variabe的最终值是'\0'…计算机不应该已经知道这一点,因为我在开始声明和赋值时就知道了吗 #include<stdio.h> #include<stdlib.h> #include <string.h> int main()

这是我将string2附加到string1的代码。当我添加以下行时,代码工作正常:s1[null_index]='\0' 但是当我省略它时,它会在输出中再添加一次“road”这个词……为什么?为什么我必须指定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);
}
#包括
#包括
#包括
int main()
{
char s2[]=“一条孤独的路”;
char s1[]=“成功是”;
int l=strlen(s1);
int null_index=l,i=0;
而(s2[i]!='\0')
{
s1[null_index]=s2[i];
i++;
null_index++;
}
s1[null_索引]='\0';
printf(“%s”,s1);
}

问题在于您拥有的阵列大小固定。一旦初始化,任何超出空终止符的索引都将超出范围并导致错误

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


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

问题在于您拥有的数组大小固定。一旦初始化,任何超出空终止符的索引都将超出范围并导致错误

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


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

s1
仅分配
成功所需的内存,并且当您尝试执行
s1[null_index]=s2[i]
您正在诱导一种未定义的行为。

s1
仅分配
成功所需的内存,并且当您尝试执行
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(
\0
)。因此,
printf
将在提供的字符串中查找
\0
,以终止
字符串的打印

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

首先

char s2[]="a lonely road";
char s1[]="Success is ";
将声明大小为14的
s2
和大小为12的
s1
。因此,当您将超过12个字符写入
s1
时,您正在调用未定义的行为

把它改成

char s1[100]="Success is ";

回答你的问题

c
中,字符串是以定义结尾的null(
\0
)。因此,
printf
将在提供的字符串中查找
\0
,以终止
字符串的打印


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

抱歉。你的程序完全错了。您正试图在没有为您分配内存的情况下注销
s1
的“结束”。你真正的问题是什么?C中的字符串必须以0结尾。您需要学习如何缩进代码。请看C语言课本中的示例。对不起。你的程序完全错了。您正试图在没有为您分配内存的情况下注销
s1
的“结束”。你真正的问题是什么?C中的字符串必须以0结尾。您需要学习如何缩进代码。看看你的C教科书中的示例。如果我设置了一个适合两个字符串的大小…比如100…那么这意味着“\0”将自动添加到末尾,对吗?另一方面,如果我没有指定这样的大小,那么计算机将不知道“\0”在哪里,因为它已被覆盖。我的理解正确吗?@AnasAziz终止符将“自动”添加,因为在初始化时,数组中未使用的部分将被初始化为零。但是你自己总是显式地添加终止符是一个好习惯。因此,如果我设置了一个适合两个字符串的大小…比如100…那么这意味着“\0”将自动添加到末尾,对吗?另一方面,如果我没有指定这样的大小,那么计算机将不知道“\0”在哪里,因为它已被覆盖。我的理解正确吗?@AnasAziz终止符将“自动”添加,因为在初始化时,数组中未使用的部分将被初始化为零。但是,总是自己明确地添加终结者是一个好习惯。