用于连接两个字符串的 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=]
字符,它将继续打印字符,直到找到一个最终调用未定义行为的字符。
所以这是我将字符串 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=]
字符,它将继续打印字符,直到找到一个最终调用未定义行为的字符。