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

时间:2016-03-02 06:46:39

标签: c io scanf getchar

我对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如何处理这种情况呢?

1 个答案:

答案 0 :(得分:6)

当您使用scanf尝试读取整数时,如果您输入的某些不是整数,那么scanf将失败并且不会返回{{1 }}。然而,它会保持输入完整,它不会从输入中提取任何内容,而是将所有内容循环用于消化和打印。

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

相关问题