Я новичок в языке C и сейчас пытаюсь подсчитать количество вводимых символов.
#include <stdio.h>
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%1d\n", nc);
}
Это то, что я написал так же, как и мой учебник, но функция printf, похоже, не работает.
Кроме того, похоже, что эта программа не завершается, потому что подсказка не появляется.
Я понятия не имею, достаточно ли старое содержание этой книги.
Не могли бы вы сказать мне, что не так с этим кодом?
Это похоже на код от K&R. И был кто-то еще, кто столкнулся с той же проблемой неверной интерпретации %ld
как %1d
. Учитывая, что nc
относится к типу long
, вам понадобится %ld
(буква ell). В книге есть буква, а не буква. Использование main()
показывает, что книга датирована (2-е изд. 1988 г.). C99 требует возвращаемого типа и предпочитает void
в списке аргументов: int main(void)
. — person agongji schedule 15.02.2020
Здравствуйте, близкие избиратели, рекомендую НЕ считать этот вопрос опечаткой. Джон гениально объяснил совершенно иную проблему с точки зрения ОП. — person agongji schedule 15.02.2020
Предыдущий вопрос был Нет вывода для кодов, написанных на языке программирования C Брайаном В. Керниганом и Деннисом М. Ричи, но сейчас он закрыт. Там было несколько лишних опечаток. — person agongji schedule 15.02.2020
Если вы включите предупреждения (что вы всегда должны делать), компилятор укажет вам на проблему, например предупреждение: формат «% d» ожидает аргумент типа «int», но аргумент 2 имеет тип «long int». В GCC вы можете использовать флаг -Wall. — person agongji schedule 15.02.2020
Это похоже на код из языка программирования C, 2-е изд. (1988), глава 1, стр.18.
Проблема в том, что ваша транскрипция кода неверно интерпретирует
%ld
как%1d
. Учитывая, чтоnc
относится к типуlong
, вам понадобится%ld
(буква ell), а не%1d
(цифра один). В книге есть буква, а не буква.С подходящими параметрами компиляторы, такие как GCC и 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
).Как вы уже догадались, это от K&R. И я исправил некоторые несоответствия типов, на которые вы указали, и, кроме того, теперь я понял, что на самом деле означает EOF. когда я вернулся к приглашению, я всегда использовал Contrl-C, поэтому функция printf не работала хорошо. Большое спасибо за ваш совет, который действительно был правильным. Я впервые пользуюсь этим сайтом, и теперь я удовлетворен. — person agongji; 17.02.2020