【发布时间】:2017-10-31 19:48:57
【问题描述】:
#include <stdio.h>
int main(void) {
int n,m=5;
char c;
while(m>0)
{
m--;
scanf("%d",&n);
if(n==42)
break;
printf("%d",n);
fflush(stdin);
scanf("%c",&c);
puts(&c);
}
return 0;
}
虽然我知道当第一次输入数字scanf 后按下回车键时,第二个scanf 会将它(回车)作为输入,但我的疑问是,当我给5ttttt 时输入,输出为
5t
5t
5t
5t
5t
由于输入缓冲区中没有整数,为什么不要求输入整数|
第二个问题是,即使我们遵循上述行为,然后在输入 5t 然后按 enter 应该将两个字符作为缓冲区('t' 和 'enter')但只有 t 被带入缓冲区,输出为
5t
但我期待输出
5t
5
因为 'enter' 将被放入缓冲区,它不会在循环的第二次迭代中要求整数输入。
【问题讨论】:
-
欢迎来到 Stack Overflow!
fflush(stdin);is undefined behaviour, don't do it. -
您在哪个平台上工作?如果您在 Windows 上,您将获得与在类 Unix 系统上不同的行为。有关详细信息,请参阅Using
fflush(stdin)。每次使用时都应该检查scanf()的返回值。 -
@JonathanLeffler 我在 Mac 上工作,我也在 ideone.com 上检查了我的输入
-
如果您使用的是 Mac,那么
fflush(stdin)充其量是无操作的。读完5后,scanf("%c", &c);读到t;下一个scanf("%d", &n);失败(但您忽略了这一点)而不更改n,并且scanf("%c", &c);读取t。这会持续 5 次迭代,然后循环因计数 (m) 降至 0 而终止。如果您输入5tuvwx,您会得到更好的启发。 -
@JonathanLeffler 这正是我要问的,为什么下一个
scanf("%d",&n);失败,我尝试输入 5tuvwx。