Подсчет количества символов в языке C

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

См. также:  Что вам даст перестановка указателя при сборке мусора?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. agongji

    Это похоже на код из языка программирования 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

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: