scanf 和 getchar 处理流的方式不同吗?

Do scanf and getchar handle stream differently?

我对 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 如何以不同方式处理这种情况?

当您使用 scanf 尝试读取一个整数,并且您提供的一些输入 不是 整数时,scanf 将失败并且不是 return 1。然而,它将保持输入完好无损,它不会从输入中提取任何内容,而是将其全部留给您的内部循环来消化和打印。

如果在外循环中使用 getchar,它实际上会消耗一个字符,无论它是什么字符,而内循环将看不到该字符,因为它不存在于输入缓冲区了。