Почему getchar() не распознает return как EOF на консоли?
У меня есть небольшой фрагмент кода ниже, который я запускаю с помощью PellesC.
Когда код выполняется, и я набрал несколько символов в консоли, я нажимаю клавишу ввода.
Можете ли вы объяснить мне, почему строка printf("%ld\n", nc);
, похоже, не выполняется? Поскольку на консоль не записывается вывод.
#include <stdio.h>
int main(void)
{
long nc = 0;
while(getchar() != EOF)
{
++nc;
}
printf("%ld\n", nc);
}
Я решил внимательно изучить C с помощью книги K & R, и я смущен, сказав, что этот довольно элементарный пример меня озадачил.
Ответы
Ответ 1
Нажатие ввода фактически не вызывает EOF
( "конец файла" ). Вы должны сообщить, что вы полностью закончили с предоставлением ввода; в Unix вы обычно это делаете, нажимая Ctrl D. В Windows я считаю, что это Ctrl Z, а затем введите, но я действительно не уверен в этом.
Ответ 2
Вы получите только EOF
из потока, когда достигнут конец файла, а не конец строки. Как вы сигнализируете, что конец файла зависит от настроек вашей ОС и терминала.
Обычно это CTRL d для систем типа UNIX и CTRL z для Windows. Для UNIX в готовом режиме (обычный режим ввода) вам обычно нужно вводить его в качестве первого символа строки и следовать ему с новой строкой (ENTER).
В Windows CTRL z можно вводить в любом месте строки, но по-прежнему нужно следовать новой строке.
В UNIX фактический символ, чтобы сообщить интерфейс терминала, который вы хотите отправить EOF
, можно установить с помощью команды stty
. Если вы выполните stty -a
, вы увидите что-то вроде:
speed 38400 baud; rows 45; columns 150; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D;
eol = <undef>; eol2 = <undef>; swtch = ^Z; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl
-cstopb cread -clocal -crtscts -ignbrk brkint -ignpar -parmrk
-inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany
-imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill
-ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo
-echoe -echok -echonl -noflsh -tostop -echoctl -echoke
В конце второй строки вы можете увидеть, что EOF
установлен на ^D
(CTRL d). Вы можете изменить это с помощью:
stty eof ^x
чтобы установить его на CTRL x, например. Вы также можете установить огромное количество других вещей, большинство из которых сделают ваш текущий терминал непригодным для использования, поэтому будьте осторожны: -)
В нижней строке, если вы хотите сообщить своей программе, что файл закончен, используйте CTRL d для UNIX (или проверьте stty
, если это не сработает) или CTRL z для Windows, Если вы хотите просто получить строку ввода, используйте символ \n
в вашем коде следующим образом:
#include <stdio.h>
int main (void) {
long nc = 0;
while(getchar() != '\n')
++nc;
printf("%ld\n", nc);
return 0;
}
Ответ 3
Как вы заканчиваете свой вход и какую систему вы используете?
Если вы нажмете комбинацию клавиш "прерывание" или "убить", возможно, вы убиваете свой процесс, прежде чем он сможет распечатать.
Если вы используете что-то вроде Ctrl-D в unix или Ctrl-Z в начале строки в окнах, это будет сигнализировать "конец ввода", не убивая процесс.
Вы также можете попробовать перенаправить свой ввод из тестового файла. например:.
myprogram <input.txt
Ответ 4
В Windows либо CTRL-Z, либо F6 будут сигнализировать о завершении файла.
Ответ 5
ВВОД записывается в код как '\n'
. Попробуйте это
#include <stdio.h>
int main(void)
{
long nc = 0;
/* count chars, except for ENTER */
while(getchar() != '\n')
{
++nc;
}
printf("%ld\n", nc);
return 0;
}
Ответ 6
"Нажмите enter"? Цикл вашего кода продолжает повторяться до тех пор, пока он не достигнет маркера конца файла. "Нажатие ввода" не приведет к EOF. Если вы хотите имитировать EOF с клавиатуры, обратитесь к документации для вашего терминала. В Windows, например, вам нужно нажать Ctrl + Z, чтобы генерировать EOF.
Ответ 7
getchar() возвращает значение из стандартного значения (обычно это клавиатура). Я не помню, к какому символу будет отображаться EOF, но вы, вероятно, не можете его ввести.
Ответ 8
Работа EOF
Введите ваши входы и нажмите Enter.
затем ctrl + z для Windows и ctrl + d для Unix, затем нажмите Enter.
То же самое можно увидеть в приложении Image i.
Это определенно.