【问题标题】:Using getchar() in a while loop在 while 循环中使用 getchar()
【发布时间】:2011-02-02 17:31:23
【问题描述】:
#include <stdio.h>
main()
{
    int c ;
    while ((c = getchar()) != EOF)
    {
        int isEOF = (c==EOF);
        printf("is %c EOF: %d ", c, isEOF);
    }
}

为什么这里的每个输入字符都会调用 printf() 方法两次?

如果我输入'a',我会得到类似的结果

E:\C_workouts>gcc CharIO.c -o CharIO.exe

E:\C_workouts>CharIO.exe
a
is a EOF: 0 is
 EOF: 0

每个输入都会发生同样的情况。

【问题讨论】:

    标签: c while-loop getchar


    【解决方案1】:

    因为在 getchar() 的某些实现中,当您按下键“x”和 ENTER 时,缓冲区中有两个字符(“x”和一个换行符)。 (我知道,这有点愚蠢) 您应该在循环中跳过换行符。

    更新:这里已经回答了这个问题:Where does `getchar()` store the user input?

    【讨论】:

    • 这是主观的......但我认为实现的行为并不像人们期望的那样,并且大量的程序员(包括我自己)已经被这一点所困扰。从手册页(“从流中读取下一个字符”)来看,我们希望每个键在按下后立即被读取;实际上标准输入是由行缓冲的。 (除了可以编辑 - 即退格不会作为键发送等)c-faq.com/osdep/cbreak.html 即使了解了这种行为,也并不明显 ENTER 键会产生换行符。
    【解决方案2】:

    这应该可以...

    诠释 c ; 而 (((c=getchar())^EOF)) printf("是 %c EOF: %d", c, c^EOF?0:1);

    【讨论】:

    • 与 EOF 的 XOR 是不必要的丑陋。此外,您的代码仍然具有与 OP 相同的行为。
    【解决方案3】:

    因为你输入了'a' '\n'...

    \n”是在终端/控制台的输入行中键入后按[ENTER] 键的结果。 getchar() 函数将返回每个字符,一次一个,直到输入缓冲区被清除。因此,您的循环将继续循环,直到 getchar() 吃掉 stdin 流缓冲区中的任何剩余字符。

    如果您希望在调用getchar() 时清除stdin 输入缓冲区,那么您应该while((ch=getchar())!='\n'&amp;&amp;ch!=EOF); 刷新stdin 以消耗之前的任何调用getchar() 之前缓冲区中的内容。一些实现(即许多 DOS/Windows 编译器)提供非标准的fflush(stdin);

    【讨论】:

      猜你喜欢
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多