scanf 时与 char 数组混淆
Posted
技术标签:
【中文标题】scanf 时与 char 数组混淆【英文标题】:Confused with the char array when scanf 【发布时间】:2011-11-08 19:18:12 【问题描述】:我对一个小程序感到困惑。
#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;
如果我的输入是:
芒果巴淘 mangobatao123456
为什么输出应该是:
123456 mangobatao123456
而不是:
芒果巴淘 mangobatao123456
char
数组是如何在内存中分配的?
【问题讨论】:
scanf("%s", str)
本质上是不安全的,除非您完全控制将出现在标准输入上的内容。不管str
多么大,用户可以键入的字符多于它所能容纳的字符,从而导致未定义的行为。 (如果你幸运的话,未定义的行为只有会使你的程序崩溃。)
***.com/questions/9291348/…
【参考方案1】:
好吧,一个 10 个字符的 char
数组不适合 "mangobatao"
,因为它有 10 个字符 - 没有空终止符的空间。这意味着你已经导致了未定义的行为,所以任何事情都可能发生。
在这种情况下,看起来您的编译器在内存中已经在 str1
之前布局了 str2
,因此当您调用 scanf
来填充 str2
时,较长的字符串会覆盖 str1
的开头。这就是为什么您在尝试打印 str1
时看到您认为应该在 str2
中的结尾。如果您使用 100 的长度,您的示例将正常工作。
【讨论】:
【参考方案2】:我认为您的编译器在 str1 指针之前仅 10 个字符为 str2[10] 分配了空间。
现在,当您在 str2 处扫描长度为 16 的字符串时,字符串终止符 '\0' 将附加在 str2 + 17th 位置,实际上是 str1 + 7。
现在,当您在 str1 处调用 printf 时,读取的字符实际上是 str2 + 11、str2 + 12、...、str2 + 16,直到在 str2 + 17(或 str1 + 7)处遇到空终止符。 str2 处的 printf 必须很明显。
【讨论】:
以上是关于scanf 时与 char 数组混淆的主要内容,如果未能解决你的问题,请参考以下文章