Изучение функции getchar () - PullRequest
0 голосов
/ 01 марта 2019

Меня интересует C, поэтому я хочу больше узнать о C, особенно C89, чтобы увидеть, как этот язык менялся с течением времени :).Я купил Денисом Ритчи "Язык программирования Си" (2-е издание).

Пример в книге подводит меня к сложной ситуации с функцией getchar ().

Пример 1, которыймой пример после прочтения книги:

#include <stdio.h>

int main()
{
    int c = getchar();
    printf("\'\\n\' character in c: %d\n", c == '\n');
    printf("\'\\n\' character in c: %d\n", c == '\n');
}

Вывод примера 1:

a
'\n' character in c: 0
'\n' character in c: 0

В этом случае выходные данные не показывают никаких новых строк в этом входе,ОДНАКО другой пример, который я пробую:

#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF) {
        printf("\'\\n\' character in c: %d\n", c == '\n');
    }
}

и вывод кода:

a
'\n' character in c: 0
'\n' character in c: 1

Я не понимаю, почему второй пример дублирует функцию printf () икак он мог прочитать символ '\ n', когда он входит в цикл.Между тем, первый пример не показывает ничего, касающегося символа '\ n'

Ответы [ 3 ]

0 голосов
/ 01 марта 2019
  • Вы вводите a и нажимаете ввод.Буфер stdin будет выглядеть как a, \n, два символа.
  • Первый круг в цикле, c имеет значение 'a', которое не равно '\n',выход 0.
  • На следующем круге в цикле c имеет значение '\n', равное '\n', выход 1.
  • В конце ввода, когда c становится EOF, printf никогда не выполняется.
0 голосов
/ 01 марта 2019

Возьмите второй пример, т.е.

while ((c = getchar()) != EOF) {
    printf("\'\\n\' character in c: %d\n", c == '\n');
}

и разверните цикл.Это станет:

c = getchar();
if (c == EOF) return 0;
printf("\'\\n\' character in c: %d\n", c == '\n');
c = getchar();
if (c == EOF) return 0;
printf("\'\\n\' character in c: %d\n", c == '\n');
c = getchar();
if (c == EOF) return 0;
printf("\'\\n\' character in c: %d\n", c == '\n');
... and so on ...

Теперь сравните это с вашей первой версией, и вы увидите, что разница в том, что второй пример делает вызов getchar между printf, тогда как в первом примере есть только один getchar call.

Другими словами - в первом примере читается только символ 'a', в то время как во втором примере сначала читается 'a', затем читается '\n', а затем читается .... (все, что вывведите следующий)

0 голосов
/ 01 марта 2019

Вы нажимаете ввод после ввода a.

Таким образом, ваш поток ввода будет иметь "a\n".

while ((c = getchar()) != EOF) {

Будет считываться, пока не достигнет EOF, таким образом, онсначала будет читаться a, затем \n (введите).

...