【发布时间】:2026-02-15 16:10:01
【问题描述】:
见以下代码:
int main()
{
char test[3];
scanf("%s", test);
__fpurge(stdin);
printf("%s", test);
}
程序应该只记录 3 个字符,但是当我键入时,例如,8 个字符,程序会记录全部 8 个字符!这不应该发生。正确的会记录 3 个字符,因为 scanf 是这样做的吗?
【问题讨论】:
-
这是未定义的行为。这意味着任何事情都可能发生,包括显然工作正常。我没有系鞋带。为什么我没有摔倒?这不是问题。
-
您没有告诉
scanf()有多少空间可用于数据,因此它假定必须有足够的空间用于输入的任何内容。因此,它尽最大努力存储 8 个字符——但这会溢出您指定的数组,导致未定义的行为。如果您学习了一种具有缓冲区溢出自动保护功能的现代语言,那么学习 C 语言将会很困难。 C 环境不能保护您免受误解或粗心的行为。 (而char test[3]只能容纳两个字符的字符串,加上空终止符。) -
很好奇,为什么你期望 C不接受超过缓冲区空间的字符?