在while循环中使用getchar()

#include  main() { int c ; while ((c = getchar()) != EOF) { int isEOF = (c==EOF); printf("is %c EOF: %d ", c, isEOF); } } 

为什么printf()方法在每个输入char上被调用两次?

如果我输入’a’,我得到的结果就像

 E:\C_workouts>gcc CharIO.c -o CharIO.exe E:\C_workouts>CharIO.exe a is a EOF: 0 is EOF: 0 

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

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

更新:这已在这里得到解答: `getchar()`在哪里存储用户输入?

因为你键入’ a\n ‘…

\n ‘是在输入终端/控制台输入线后按[ENTER]键的结果。 getchar()函数将一次返回一个字符,直到输入缓冲区清除为止。 所以你的循环将继续循环,直到getchar()吃掉了stdin流缓冲区中的任何剩余字符。

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

这应该工作……

     int c;
     while(((c = getchar())^ EOF)) 
         printf(“是%c EOF:%d”,c,c ^ EOF?0:1);