getchar () и putchar () - PullRequest
       26

getchar () и putchar ()

6 голосов
/ 03 февраля 2010

в примере:

#include <stdio.h>

main()
{
    long nc;

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

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

Ответы [ 5 ]

8 голосов
/ 03 февраля 2010

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

2 голосов
/ 03 февраля 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 */
}
1 голос
/ 12 июня 2011

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

1 голос
/ 03 февраля 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 (который я скопировал в этот ответ).

1 голос
/ 03 февраля 2010

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

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

...