Основная функция, связанная с getchar() в книге K&R C, не работает?
#include <stdio.h>
main()
{
double nc;
for(nc=0; getchar()!=EOF; ++nc);
printf("%1d\n",nc);
}
Я впервые изучаю C, и есть несколько вещей, которые я не очень хорошо понимаю. Цикл for имеет довольно простую структуру, единственным ограничением которой является getchar
не равно EOF
(что бы это ни значило EOF
установлено быть). Каждый раз getchar
не равно EOF
, nc
увеличивается Наконец мы выходим из цикла с nc
настраивается на длину строки.
Однако программа принимает только входные данные и не отображает значение, которое должно быть связано с длиной символа. Что я не понимаю? Я предполагаю, что у книги гораздо больше шансов быть правым, чем у меня, поэтому я думаю, что где-то ошибаюсь.
3 ответа
Программа продолжает читать ввод, пока не дойдет до конца ввода. Если вы печатаете на терминале, вам необходимо выяснить, как сигнализировать об окончании ввода. В Windows нажмите Ctrl+Z, затем Enter. В Unix-подобных системах (Linux, macOS и т. Д.) Нажмите Ctrl+D в начале строки. Или же заставьте программу читать из файла: в командной строке Windows запустите myprogram.exe <somefile.txt
, В Unix-подобной командной строке запустите ./myprogram <somefile.txt
,
Как только программа достигнет конца файла, она, скорее всего, вылетит или напечатает бессмысленное значение, потому что в вашем файле есть ошибка printf
заявление. nc
это значение с плавающей точкой, но %d
требуется целочисленное значение (точнее, значение типа int
). Вот три комбинации, которые работают:
Integer:
int nc; … printf("%d\n", nc);
Целое число большего размера, как в первом примере в K&R - обратите внимание, что это строчные буквы
l
, а не цифра1
:long nc; … printf("%ld\n", nc);
Число с плавающей точкой, которое может допускать большие значения (на современном ПК это допускает большие значения, чем
long
в 32-битной программе, ноlong
позволяет большие значения в 64-битной программе):double nc; … printf("%f\n", nc);
Хороший компилятор предупредит вас о несоответствии с printf
, Убедитесь, что вы включили предупреждения. Например, вот что gcc -Wall -O aliman.c
должен сказать о вашей программе:
aliman.c:3:1: warning: return type defaults to ‘int’ [-Wreturn-type]
main()
^
aliman.c: In function ‘main’:
aliman.c:9:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]
printf("%1d\n",nc);
^
aliman.c:13:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
Предупреждение о типе возврата main
это потому что main()
это устаревший ярлык, в современном C вам нужно написать int main()
, (Сделать это int main(void)
если вы педантичны.) Последнее предупреждение говорит, что нет return
заявление - main
функция должна возвращать значение (условно, оно указывает, была ли программа успешной или неудачной). Обе темы будут рассмотрены в §1.7.
Однако программа принимает только входные данные и не отображает значение, которое должно быть связано с длиной символа. Что я не понимаю? Я предполагаю, что у книги гораздо больше шансов быть правым, чем у меня, поэтому я думаю, что где-то ошибаюсь.
Цикл for заканчивается только тогда, когда стандартные входные сигналы EOF. Это может быть сделано с Ctrl+d
на линуксе вообще. Для других операционных систем вам нужно найти подвеску.
После окончания цикла for количество прочитанных символов будет отображаться на стандартном выходе.
Некоторые замечания: nc
должно быть целым числом. Строка формата для printf
функции достаточно, чтобы быть %d
затем.
Форматирование исходного кода может помочь вам легче понять. Обратите внимание, что цикл for не содержит printf
(как вы могли предположить).
#include <stdio.h>
main()
{
int nc;
for(nc=0; getchar()!=EOF; ++nc)
;
printf("%d\n",nc);
}
У вас есть три возможных варианта
- + Изменить
double
вint
- + Изменить
"%d"
вprintf()
в"%lf"
- В ролях
nc
вint
как это(int)nc;
Это будет считать '\n'
также
или если вы не считаете '\n'
for (int i = 0; i != EOF; !i ? nc = 0 : nc, i != '\n' && i ? nc++ : nc, i = getchar());