Программирование на C из Книги K & R - PullRequest
7 голосов
/ 05 декабря 2008

Есть идеи, почему следующий код не печатает количество символов на входе? Я взял это прямо из книги K & R. Изучение C на данный момент, и это действительно сбивает с толку, мне кажется, что я никогда не достигну EOF. Если это так, то почему бы это использовать в качестве примера?

#include <stdio.h>

main()
{
    double nc;

    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%d\n", nc);
}

Ответы [ 6 ]

12 голосов
/ 05 декабря 2008

Программа выглядит правильно, ваша проблема в том, что вы должны отправить EOF (конец файла) в командную строку после ввода, поскольку стандартный ввод обрабатывается как файл. Я думаю, что в терминале Linux вы можете нажать Ctrl + D, чтобы отправить EOF ... Я не уверен, как это сделать в других ОС. Чтобы протестировать эту программу, вы можете изменить EOF на '\n', что приведет к ее остановке при нажатии клавиши ввода.

7 голосов
/ 05 декабря 2008

Программа продолжает чтение данных от stdin до получения EOF, это делается нажатием Ctrl-D в начале строки на консоли Unix или Ctrl-Z в начале строки в Windows приставка. После того, как вы подадите сигнал EOF таким образом, будет выполнена функция printf, отображающая количество прочитанных символов.

6 голосов
/ 05 декабря 2008

Ваш nc является двойным - используйте printf("%lf", nc) для печати двойных.

Попробуйте вместо этого

#include <stdio.h>

int main(void)
{
    int nc;

    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%d\n", nc);

    return 0;
}
5 голосов
/ 05 декабря 2008

Я хотел бы уточнить ответы, данные до сих пор, потому что они, кажется, используют фразы, такие как "отправить EOF", "полученный EOF", "символ EOF" и т. Д. Согласно комментариям (спасибо) к этому ответу, "отправить EOF "и" полученный EOF "являются законными терминами, но, пожалуйста, не думайте, что это персонаж.

EOF вообще не персонаж. Это значение, которое getchar () (или fgetc / getc) возвращает, если поток находится в конце файла или возникает ошибка чтения. Это просто специальное значение вне диапазона символьных значений, которое возвращает getchar (), которое указывает условие ошибки или конца файла.

Он определен стандартом C как отрицательный, тогда как getchar возвращает символы в виде знака без знака, преобразованного в int.

Редактировать: Проведя некоторое исследование, которое я должен был сделать до того, как я написал абзац, который был здесь, я понял, что некоторые из моих предположений были полностью неверными. Спасибо комментатору за указание на это.

Когда поток (такой как stdin) находится в состоянии конца файла, это условие может быть очищено снова с помощью clearerr (), и getchar () может читать больше данных из stdin.

1 голос
/ 05 декабря 2008

Этот код читает символы из стандартного ввода. Когда вы запускаете эту программу нормально, стандартный ввод поступает от пользователя. В этом случае невозможно отправить EOF в программу.

Этот код будет работать, если вы перенаправите файл в стандартную папку (./myprogram

0 голосов
/ 05 декабря 2008

Во-первых, как упоминалось ранее, вам нужно% lf вместо% d для отображения двойного числа, иначе оно будет просто отображать ноль все время (d для целого числа со знаком). Затем, если вы хотите проверить это вручную в ОС Windows на основе типа некоторых символов, нажмите Enter, а затем нажмите CtrlZ на следующей строке в одиночку (это будет имитировать EOF). Результат печати будет на один больше, чем количество символов (включая CtrlZ). Также, как указывал SoapBox при поиске EOF, как правило, в то время задумывался о Unix, где вы передаете файл в программу через стандартный ввод, это также будет работать.

...