Как работает getchar ()? - PullRequest
       5

Как работает getchar ()?

43 голосов
/ 09 сентября 2010

Я смущен программой, упомянутой в K & R, которая использует getchar(). Он дает тот же вывод, что и входная строка:

#include <stdio.h>

main(){
    int c;
    c = getchar();
    while(c != EOF){
         putchar(c);
         c = getchar();
    }
}

Почему печатается вся строка? Я ожидаю, что он прочитает символ и снова запросит ввод.

И все ли строки, которые мы вводим, заканчиваются EOF?

Ответы [ 5 ]

40 голосов
/ 09 сентября 2010

В простой настройке, которую вы, вероятно, используете, getchar работает с буферизованным вводом, поэтому вы должны нажать Enter, прежде чем getchar сможет что-либо прочитать.Строки не заканчиваются на EOF;на самом деле EOF на самом деле не символ, а магическое значение, указывающее конец файла.Но EOF не является частью прочитанной строки.Это то, что getchar возвращает, когда читать нечего.

30 голосов
/ 09 сентября 2010

Существует базовый буфер / поток, из которого читают getchar () и друзья. Когда вы вводите текст, текст где-то сохраняется в буфере. getchar () может передавать по одному символу за раз. Каждое чтение возвращает следующий символ, пока не достигнет конца буфера. Причина, по которой он не запрашивает у вас следующие символы, заключается в том, что он может извлечь следующий из буфера.

Если вы запустите свой скрипт и введете его непосредственно в него, он будет продолжать запрашивать ввод данных, пока вы не нажмете CTRL + D (конец файла). Если вы называете это как ./program

В качестве дополнительного предупреждения я считаю, что getchar () также вернет EOF, если обнаружит ошибку, поэтому вы захотите проверить ferror (). Пример ниже (не проверено, но вы поняли).

main() {
    int c;
    do {
        c = getchar();
        if (c == EOF && ferror()) {
            perror("getchar");
        }
        else {
            putchar(c);
        }
    }
    while(c != EOF);
}
10 голосов
/ 09 сентября 2010

Строки по определению C оканчиваются на '\0'.В вашей программе нет "C strings".

Ваша программа считывает символы (буферизованные до ENTER) со стандартного ввода (клавиатура) и записывает их обратно на стандартный вывод (экран).Это происходит независимо от того, сколько символов вы вводите или как долго вы это делаете.

Чтобы остановить программу, вы должны указать, что на стандартном вводе больше нет данных (да?на клавиатуре больше нет данных?) .

Просто введите Ctrl+D (Unix) или Ctrl+Z (Windows), чтобы сделать вид, что файл достиг своего конца.
Ctrl+D (илиCtrl+Z) на самом деле не являются символами в C смысле этого слова.

Если вы запускаете вашу программу с перенаправлением ввода, EOF является фактическим концом файла, а не вымышленным.
./a.out < source.c

3 голосов
/ 09 сентября 2010

getchar () читает один символ ввода и возвращает этот символ в качестве значения функции.Если при чтении символа произошла ошибка или достигнут конец ввода, getchar () возвращает специальное значение, представленное как «EOF».

2 голосов
/ 14 января 2015

Согласно определению getchar () он читает символ из стандартного ввода.К сожалению, stdin ошибочно принят за клавиатуру, что может быть не так для getchar.getchar использует буфер как стандартный ввод и читает по одному символу за раз.В вашем случае, поскольку EOF отсутствует, getchar и putchar выполняются несколько раз, и вам кажется, что за один раз выводится вся строка.внесите небольшое изменение, и вы поймете:

putchar(c);
printf("\n");     
c = getchar();

Теперь посмотрите на вывод по сравнению с исходным кодом.

Еще один пример, который объяснит вам понятие getchar и буферизованного stdin:

void main(){
int c;
printf("Enter character");
c = getchar();
putchar();
c = getchar();
putchar();
}

Введите два символа в первом регистре.Во второй раз, когда запущен getchar, вводите ли вы какого-нибудь персонажа?НЕТ, но все еще работает putchar.

В конечном итоге это означает, что есть буфер, и когда вы что-то набираете и нажимаете ввод, он уходит и устанавливается в буфере.getchar использует этот буфер как stdin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...