#c
#c
Вопрос:
В следующем коде происходит что-то странное:
#include<stdio.h>
int main() {
int counts=0,x;
while ((x=getchar()) != EOF)
counts = 1;
printf("%d",counts);
return 0;
}
Когда я ввожу asd^Zn
( ^Z
представляет собой EOF
, n
представляет ввод), на выходе 4
вместо 3
;
Когда я ввожу asdn
, ^Zn
вывод становится 3
.
Итак, что отличает его? Почему при первой попытке программа учитывает EOF
?
Комментарии:
1. Если вы программируете на C, не помечайте вопрос C .
2. @DanielDaranas Я не вижу здесь использования какой-либо неинициализированной переменной.
3. @user3477950 Некоторые люди считают подобный код
{ int x; ... ; x = foo();
плохим, посколькуx
некоторое время не инициализируется, пока не будет выполнен вызовfoo()
. Я не согласен, но, возможно, именно это имел в виду Дэниел Даранас.4. @DanielDaranas Все это совершенно не имеет отношения к рассматриваемому вопросу, а также довольно субъективно. Также
while ((x=getchar()) != EOF)
это достаточно часто используемая идиома в C, чтобы не требовать какой-либо критики.5. @Vince_Wang Нет, C не является подмножеством C . Этого никогда не было.
Ответ №1:
Предполагая, что вы используете Windows: если вы нажмете asd ^ Z n , CTRL-Z не завершит ввод, так что это не условие EOF, это просто ascii-код 26 (символ «subsitute»).)
В консоли Windows строка должна начинаться с CTRL-Z, чтобы привести к состоянию EOF.
(Имейте в виду, что EOF — это не символ, это справедливое условие, которое означает, что больше нет доступных входных данных. Операционная система заботится о преобразовании нажатия клавиш CTRL Z для выполнения всего, что необходимо для завершения стандартного ввода вашей программы — но это происходит, только если CTRL-Z находится в начале строки)