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 ответ:
В 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
.