Странное поведение при базовом вводе-выводе

#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 находится в начале строки)