Это похоже на код из K & R C Язык программирования, 2nd Edn (1988), глава 1, стр. 18.
Проблема в том, что ваша транскрипция кода неверно истолковывает %ld
как %1d
. Учитывая, что nc
имеет тип long
, вам нужно %ld
(буква ell), а не %1d
(di git one). Книга содержит ell, а не единицу.
При подходящих параметрах компиляторы, такие как G CC и Clang, будут выдавать предупреждения о несовпадении типов в строках формата. Используйте -Wall -Werror
для получения ошибок при неправильном коде (или -Wformat
, если вы не можете работать с -Wall
- но я использую -Wall -Wextra -Werror
плюс несколько дополнительных опций для всех моих компиляций; я не буду рисковать ошибки, о которых мне может рассказать компилятор).
Использование main()
показывает, что книга устарела. C99 требует тип возвращаемого значения и предпочитает void
в списке аргументов - int main(void)
- когда вы не используете аргументы командной строки.
Что касается программы, не завершающей работу, когда вы печатаете в терминале вы указываете EOF (конец файла) для программы, набирая Control-D в большинстве Unix -подобных систем (хотя это настраивается) и Control-Z в Windows системах. (Если вы хотите указать EOF без предварительного ввода новой строки, вам нужно набрать EOF индикатор дважды вместо одного раза.) Или вы можете передать ему файл из оболочки: counter < data-file
(при условии программа называется counter
и вы хотите посчитать символы в файле data-file
).