@unit_911

Почему не работает вывод значения переменной в цикле for?

Книга Б. Кернигана и Д. Ритчи "Язык программирования Си, издание 3-е, исправленное", CLion 2019.3.3, версия языка С99.
#include <stdio.h>
//подсчет количества вводимых символов
int main() {
    double nc;
    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%.0f,", nc);
}

Автор книги говорит, что тело цикла пустым быть не может, и мы ставим точку с запятой. Но этот код работает некорректно. Ожидается, что он посчитает все введенные в строку символы и выведет это значение. Однако после ввода символов и нажатия Enter терминал больше ничего не выводит. Если же занести функцию printf в сам цикл for, терминал выводит значения (0, 1, 2, .., х), как и должно быть. У меня несколько вариантов, почему так происходит:
1. В том коде значение переменной nc работает только внутри цикла, а так как мы не присвоили переменной хотя бы ноль перед циклом, выводить нечего. (ибо через цикл while с прибавкой значения в конце тела цикла всё также не работает)
2. Значение константы EOF некорректно работает, и потому цикл не завершается
3. Что-то иное, чего я пока не знаю (я совсем новичок)
  • Вопрос задан
  • 352 просмотра
Решения вопроса 2
includedlibrary
@includedlibrary
Всё правильно работает, просто нужно добавить в конец вводимого текста символ конца файла. В linux это делается нажатием Ctrl-D, в windows - Ctrl-Z
Ответ написан
Комментировать
@TheCalligrapher
Код ничего не выводит просто потому, что цикл никогда не завершается.

Нажатие клавиши Enter не приводит к возврату EOF из getchar(). Для того, чтобы создать ситуацию EOF при консольном вводе, вам нужно обратиться к документации на ваш терминал. Разные терминалы работают в этом отношении по-разному и их поведение может зависеть от их конфигурации.

Для Linux терминалов EOF обычно возникает, если нажать Ctrl+D при пустом входном буфере. "При пустом входном буфере" означает, что Ctrl+D нужно нажимать либо в начале новой строки, либо сразу после предыдущего нажатия Ctrl+D.

Для Windows терминалов EOF формируется, если ввести Ctrl+Z в начале новой строки и затем ввести Enter.

Отдельно стоит посоветовать вам завершать вывод символом перевода строки: printf("%.0f\n", nc);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы