C вход - getchar () - PullRequest
       21

C вход - getchar ()

2 голосов
/ 21 марта 2012

Это основной вопрос ... но должен был задать.Для такой программы, если сценарий использования 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 = %d\n", nc);
}

1 Ответ

6 голосов
/ 21 марта 2012

В Windows комбинация клавиш Ctrl-Z вступит в силу только в том случае, если она нажата в начале строки.В противном случае ОС игнорирует это.Вы должны нажать «ввод» или «возврат», чтобы сначала вставить символ новой строки.

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

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

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

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

Благодаря @R.для объяснения о EOF.

...