我对scanf和getchar如何处理不同的流感到困惑,以下是示例代码:
while(scanf("%d", &input) != 1)
{
while((ch = getchar()) != '\n')
{
putchar(ch);
}
printf("\nThis is wrong\n");
}
printf("That is right\n");
这是一个简单的程序,用于测试输入是否为整数。内部while循环用于在单击Enter之前显示每个错误的输入值。当我输入一个随机字符串,例如:
qwert
putchar将打印出确切的字符串。但是,如果我更换了
while(scanf("%d", &input) != 1)
与
while((ch = getchar()) != '\n')
并打印出完全相同的字符串,第一个字母“q”被删除。 所以我的问题是外循环中的scanf和getchar如何处理这种情况呢?
答案 0 :(得分:6)
当您使用scanf
尝试读取整数时,如果您输入的某些不是整数,那么scanf
将失败并且不会返回{{1 }}。然而,它会保持输入完整,它不会从输入中提取任何内容,而是将所有内容循环用于消化和打印。
如果你在外部循环中使用1
,它实际上会消耗一个字符,无论它是什么字符,然后内部循环将不会看到该字符,因为它不存在于输入缓冲区了。