C вход-getchar()


Это основной вопрос.. но пришлось спросить. Для такой программы, если вариант использования 123^Z, программа не завершается, даже если я ставлю EOF в конце (Ctrl+Z). Почему это так? Это работает только тогда, когда я ставлю EOF после CR. Любой ответ будет оценен по достоинству. Спасибо.

#include < stdio.h>

void main()
{
    int i, nc;

    nc = 0;
    i = getchar();
    while (i != EOF) {
        nc = nc + 1;
        i = getchar();
    }
    printf("Number of characters in file = %dn", nc);
}
1 2

1 ответ:

В Windows сочетание клавиш Ctrl-Z вступает в силу, только если оно нажато в начале строки. В противном случае ОС игнорирует его. Вы должны нажать " enter "или" return", чтобы вставить символ новой строки в первую очередь.

В Unix сочетание клавиш Ctrl-D немедленно удалит stdin (как указано в нижеприведенных комментариях), но не вызовет getchar() возврата EOF, Если вы не находитесь на новой пустой строке; то же самое, что и в Windows.

Из комментариев (ниже):

Нет никакого "символа EOF" на Юникс. EOF - это просто чтение нулевой длины. Это происходит в конце обычных файлов и может быть вызвано на терминале нажатием управляющего символа, который был настроен в настройках терминала для EOF (обычно ^D). Причина, по которой ^D "не работает", когда буфер терминала непустой, заключается в том, что он на самом деле не вставляет что-то в поток; он просто заставляет ожидающее чтение возвращаться, но так как входная длина ненулевая, это не рассматривается приложением как "EOF".

Это адресует хороший момент - ни один файл на самом деле не содержит EOF - и нажатие Ctrl-D не будет "вставлять" (как я уже говорил) что-либо в поток stdin. Он просто смывает stdin. EOF - стандартный макрос, представляющий уведомление о том, что конец файла достигнут стандартной функцией.

Спасибо @R. за объяснение о EOF.