getchar() и putchar()

в примере:

#include <stdio.h>

main()
{
    long nc;

    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
}

Я не совсем понимаю. putchar() выводит символ, но почему после EOF он выводит все символы и где он запоминает все эти символы? Спасибо.


person user379229    schedule 02.02.2010    source источник
comment
Хм... в этом коде нет putchar().   -  person SoapBox    schedule 03.02.2010
comment
О чем putchar() ты говоришь?   -  person mob    schedule 03.02.2010
comment
Я думаю, что вы разместили не ту программу от K&R!   -  person Alok Singhal    schedule 03.02.2010


Ответы (5)


Это называется буферизацией и выполняется операционной системой. Обычно он выполняет буферизацию строк, при которой он просто сохраняет в памяти каждый введенный вами символ, а затем записывает все это в файл при обнаружении разрыва строки. Это экономит ресурсы, поскольку операции с файлами занимают гораздо больше времени, чем другие операции. Таким образом, вместо того, чтобы выполнять вывод с каждым отдельным символом, он ожидает, пока группа символов соберется в буфере, и записывает их все за один раз.

Это просто хитрый маневр ОС, о котором вам, программисту, не нужно беспокоиться. Просто бросайте своих персонажей по одному, и пусть ОС справляется с остальными по-своему.

person Paige Ruten    schedule 02.02.2010

[Это не ответ, но вы не можете размещать код в комментариях]

Я думаю, вы имели в виду что-то вроде этого:

#include <stdio.h>

main()
{
    long nc;
    nc = 0;
    char c;
    while ((c = getchar()) != EOF)
    {
       putchar(c); /* prints one char */
        ++nc;
    }
    printf("%ld\n", nc); /* prints the number of characters read */
}
person egrunin    schedule 03.02.2010

Нигде, этот код только очищает ввод и записывает, сколько символов осталось до сброса.

Это делается для того, чтобы во входном файле (stdin) не осталось символов.

person José Mélançon    schedule 02.02.2010

Давайте рассмотрим ваш код:

#include <stdio.h>

Все идет нормально...

main()
{
  1. Функция main() всегда возвращает int. Всегда.
  2. Объявление функций без типа возвращаемого значения — дурной тон, так как по умолчанию используется int, но люди не помнят об этом при чтении кода.

Идем дальше...

long nc;

nc = 0;

Хорошая форма. Переменная инициализируется перед использованием.

while (getchar() != EOF)
    ++nc;

Это немного сложно. Но шаг за шагом.

  1. Функция getchar возвращает int из стандартного ввода.
  2. Затем это значение сравнивается с EOF.
  3. Если значение int из стандартного ввода не равно EOF, переменная nc увеличивается.

Таким образом, чтобы выйти из цикла while, из стандартного ввода необходимо сгенерировать EOF.

Примечание. Ни одно из значений, считанных из стандартного ввода, сохраняется. Каждое значение отбрасывается после вычисления выражения.

Стиль: я предлагаю использовать '{' и '}' после каждого оператора while. Это безопасная привычка.

printf("%ld\n", nc);

Приведенный выше оператор печатает (отображает) значение в nc. Значение в nc представляет собой количество символов, считанных со стандартного ввода. Этот оператор не отображает символы из стандартного ввода.

}

Наконец, программа main должна вернуть значение операционной системе. Два переносимых значения — EXIT_SUCCESS и EXIT_FAILURE, которые определены в stdlib.h. Указание одного из этих значений также было бы хорошей привычкой.

Кстати, в опубликованном вами примере нет putchar (который я скопировал в этот ответ).

person Thomas Matthews    schedule 03.02.2010

putchar помещает символ в буфер, когда приходит ввод, затем он выводит вывод строки на экран.

person xingyue    schedule 12.06.2011
comment
Спасибо! Мне также было интересно, почему символы не отображаются на экране по мере их ввода, несмотря на putchar() в цикле (не в приведенном выше коде, а в примере KR). - person Curious2learn; 13.10.2011