почему функция getchar () работает по-разному в цикле?
Я полагаю, вы спрашиваете, почему getchar()
работает иначе, чем вы ожидаете , в отличие от иначе, чем в других контекстах . Если вы на самом деле имели в виду последнее, то ответом будет «это не так».
Но, конечно, чтение символа из потока, будь то getchar()
или какая-либо другая функция ввода-вывода, удаляет его из потока. getchar()
было бы не очень полезно, если бы он этого не делал. Поэтому, если вы вызываете его несколько раз, вы читаете (и удаляете) каждый символ по очереди до тех пор, пока не будут использованы все доступные символы. Вы можете проверить это, заменив цикл в вашей программе несколькими getchar()
вызовами в строке.
И, конечно, ваш цикл вызывает его неоднократно. Выражение контроля цикла, (c=getchar()) != EOF
, оценивается перед каждой итерацией цикла, и это включает в себя вызов getchar()
(в отличие от использования значения, ранее возвращенного этой функцией).
В совершенно отдельном примечании учтите, что getchar()
возвращает результат типа int
, именно так, чтобы он мог вернуть хотя бы одно значение EOF
, которое находится вне диапазона типа unsigned char
, Если вы преобразуете результат в тип char
, то либо существует одно действительное входное значение, которое вы примете за EOF, либо вы никогда не обнаружите EOF, в зависимости от того, является ли char
со знаком или без знака. Чтобы надежно и точно определить конец файла, вы должны обработать это возвращаемое значение как int
, а не char
.