Почему 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. Это определенно.