1
#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

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

4

3 回答 3

2

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

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

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

于 2017-07-28T23:06:49.073 回答
1

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

更新:这里已经回答了:`getchar()` 在哪里存储用户输入?

于 2010-03-31T00:59:34.933 回答
-1

This should work...

    int c ;
    while (((c=getchar())^EOF)) 
        printf("is %c EOF: %d ", c, c^EOF?0:1);
于 2010-03-31T01:53:02.510 回答