【问题标题】:Do scanf and getchar handle stream differently?scanf 和 getchar 处理流的方式不同吗?
【发布时间】:2016-06-14 21:32:03
【问题描述】:

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

【问题讨论】:

  • getchar 在外部循环中吃掉了q。在内部循环之前添加putchar(ch) 以解决问题。另一方面,scanf("%d") 对无效输入(例如字符)将失败并返回 0,将字符(无效输入)留在 stdin 本身中。

标签: c io scanf getchar


【解决方案1】:

当您使用scanf 尝试读取一个整数,并且您提供了一些整数的输入,那么scanf 将失败并且不会返回1。然而,它会保持输入完整,不会从输入中提取任何内容,将所有内容留给您的内部循环消化和打印。

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

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2021-07-18
    相关资源
    最近更新 更多