Использование getchar () в цикле while - PullRequest
1 голос
/ 31 марта 2010
#include <stdio.h>
main()
{
    int c ;
    while ((c = getchar()) != EOF)
    {
        int isEOF = (c==EOF);
        printf("is %c EOF: %d ", c, isEOF);
    }
}

Почему метод printf () вызывается дважды для каждого входного символа здесь?

Если я введу «а», я получу результат как

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

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

То же самое происходит на каждом входе.

Ответы [ 3 ]

2 голосов
/ 29 июля 2017

Поскольку вы ввели 'a' и '\n' ...

\n - это результат нажатия клавиши [ENTER] после ввода в строку ввода вашего терминала / консоли. Функция getchar() будет возвращать каждый символ по одному, пока входной буфер не очистится. Таким образом, ваш цикл будет продолжаться до тех пор, пока getchar() не съест все оставшиеся символы из потокового буфера stdin.

Если вы ожидаете, что входной буфер stdin будет очищен при вызове getchar(), тогда вы должны flush stdin с while((ch=getchar())!='\n'&&ch!=EOF);, чтобы использовать все предыдущие данные буфер перед вызовом getchar(). Некоторые реализации (т.е. многие компиляторы DOS / Windows) предлагают нестандартные fflush(stdin);

1 голос
/ 31 марта 2010

Потому что в некоторых реализациях getchar (), когда вы нажимаете клавиши 'x' и ENTER, в буфере есть два символа ('x' и символ перевода строки) (Я знаю, это немного глупо) Вы должны пропустить новые строки в вашем цикле.

Обновление: здесь уже был дан ответ: Где `getchar ()` хранит введенные пользователем данные?

0 голосов
/ 31 марта 2010

Это должно работать ...

    int c ;
    while (((c=getchar())^EOF)) 
        printf("is %c EOF: %d ", c, c^EOF?0:1);
...