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, где вы передаете файл в программу через стандартный ввод, это также будет работать.