scanf 时与 char 数组混淆
我对一个小程序感到困惑。
#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;
}
如果我的输入是:
芒果巴涛
芒果巴涛123456
为什么输出应该是:
123456
芒果巴涛123456
而不是:
芒果巴涛
芒果巴涛123456
char
数组是如何在内存中分配的?
I am confused with one tiny program.
#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;
}
If my input are:
mangobatao
mangobatao123456
Why should the output be:
123456
mangobatao123456
And not:
mangobatao
mangobatao123456
How has the char
array has been allocated in the memory?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
嗯,10 个字符的
char
数组不适合"mangobatao"
,因为它有 10 个字符 - 没有空间容纳 null 终止符。这意味着您导致了未定义的行为,因此任何事情都可能发生。在这种情况下,看起来您的编译器已将
str2
布局在内存中的str1
之前,因此当您调用scanf
来填充str2 时
,较长的字符串会覆盖str1
的开头。这就是为什么当您尝试打印str1
时,您会看到您认为应该在str2
中的内容的结尾。如果您使用的长度为 100,您的示例将正常工作。Well, a 10 character
char
array won't fit"mangobatao"
, since it has 10 characters - there's no room for the null terminator. That means you've caused undefined behaviour, so anything could happen.In this case, it looks like your compiler has laid out
str2
beforestr1
in memory, so when you callscanf
to fillstr2
, the longer string overwrites the beginning ofstr1
. That's why you see the end of what you think should be instr2
when trying to printstr1
. Your example will work fine if you use a length of 100.我认为您的编译器已在 str1 指针之前的 10 个字符处为 str2[10] 分配了空间。
现在,当你在str2处scanf一个长度为16的字符串时,字符串终止符'\0'被附加在str2+第17个位置,这实际上是str1+7。
现在,当你在str1处调用printf时,读取的字符实际上是str2+ 11、str2 + 12、...、str2 + 16,直到在 str2 + 17(或 str1 + 7)处遇到空终止符。
str2 处的 printf 必须是显而易见的。
I think your compiler has allocated space for str2[10] just 10 characters before the str1 pointer.
Now, when you scanf a string of length 16 at str2, the string terminator '\0' is appended at str2 + 17th position, which is infact str1 + 7.
Now when you call printf at str1, the characters read are actually str2 + 11, str2 + 12,..., str2 + 16 until the null terminator is encountered at str2 + 17 (or str1 + 7).
The printf at str2 must be obvious.