C Программирование упражнение из книги K&R

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

#include <stdio.h>

main()
{
    double nc;

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

6 ответов


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


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


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

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

#include <stdio.h>

int main(void)
{
    int nc;

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

    return 0;
}

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

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

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

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

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


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

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


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