почему функция getchar () работает по-разному в цикле? - PullRequest
0 голосов
/ 12 апреля 2019
#include <stdio.h>
int main()
{
    char c;

    while ((c=getchar()) != EOF)
        putchar(c);
}

почему, когда я ввожу текст, такой как, например, "omar", вставляю char print "omar" назад. Разве нельзя печатать 'o' несколько раз, так как getchar будет принимать только первый символ. Я знаю, что яВозможно, что-то неправильно, потому что я не знаю, как именно работают getchar или putchar, поэтому кто-нибудь может объяснить, как они работают. Другой вопрос, почему getchar и putchar работают нормально без цикла while, но внутри, пока поведение цикла отличается от других.

1 Ответ

3 голосов
/ 12 апреля 2019

почему функция getchar () работает по-разному в цикле?

Я полагаю, вы спрашиваете, почему getchar() работает иначе, чем вы ожидаете , в отличие от иначе, чем в других контекстах . Если вы на самом деле имели в виду последнее, то ответом будет «это не так».

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

И, конечно, ваш цикл вызывает его неоднократно. Выражение контроля цикла, (c=getchar()) != EOF, оценивается перед каждой итерацией цикла, и это включает в себя вызов getchar() (в отличие от использования значения, ранее возвращенного этой функцией).


В совершенно отдельном примечании учтите, что getchar() возвращает результат типа int, именно так, чтобы он мог вернуть хотя бы одно значение EOF, которое находится вне диапазона типа unsigned char , Если вы преобразуете результат в тип char, то либо существует одно действительное входное значение, которое вы примете за EOF, либо вы никогда не обнаружите EOF, в зависимости от того, является ли char со знаком или без знака. Чтобы надежно и точно определить конец файла, вы должны обработать это возвращаемое значение как int, а не char.

...