Я новичок в языке 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