在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);