我对一个小程序感到困惑。
#include <stdio.h>
#define LEN 10
int main()
{
char str1[LEN] = "\0";
char str2[LEN] = "\0";
scanf("%s", str1);
scanf("%s", str2);
printf("%s\n", str1);
printf("%s\n", str2);
return 0;
}
如果我输入的是:
mangobatao
mangobatao123456
为什么输出应该是:
123456
mangobatao123456
而不是:
mangobatao
mangobatao123456
如何在内存中分配char
数组?
答案 0 :(得分:6)
好吧,一个10个字符char
数组不适合"mangobatao"
,因为它有10个字符 - 空终止符没有空间。这意味着您已经导致了未定义的行为,因此任何事情都可能发生。
在这种情况下,看起来您的编译器已在str2
之前在内存中列出str1
,因此当您调用scanf
填充str2
时,更长的字符串会覆盖str1
的开头。这就是为什么在尝试打印str2
时,您会看到{J} {1}}中的结果。如果您使用100的长度,您的示例将正常工作。
答案 1 :(得分:0)
我认为你的编译器在str1指针之前为str2 [10]分配了10个字符的空间。
现在,当您在str2处扫描长度为16的字符串时,字符串终止符'\ 0'将附加在str2 +第17位,这实际上是str1 + 7.
现在,当你在str1调用printf时,读取的字符实际上是str2 + 11,str2 + 12,...,str2 + 16,直到在str2 + 17(或str1 + 7)遇到空终止符。 str2的printf必须明显。