2016-12-08 8 views
1

Это мой пример кода. Я написал вопрос в моем комментарии:Почему я не получаю EOF?

main(){ 
    long cnt; // chars count 
    int c; 

    /* Why the 'for' cicle doesn't finish when I input the 
    * "a^Z" string and press ENTER? At this case '^Z' is 
    * CTRL + Z (i.e this is EOF). I expected the second loop 
    * will get the EOF (i.e. -1), but it has 26 instead of. Why? 
    */ 
    for(cnt = 0; (c = getchar()) != EOF; ++cnt) 
     ; 

    printf("Chars count: %ld", cnt); 
} 

Если я ставлю a, ENTER, CTRL + Z, ENTER тогда я получить ожидаемый результат: CTRL + Z брейков петли.

UPD

Когда я прочитал информацию о getchar функции, то я увидел, что она использует линию-буферные вход. Он ожидает ENTER для ввода данных. Я не видел информации, что он также может выталкивать данные, когда он получает Ctrl - Z. Поэтому я ожидал, что второе значение будет EOF в моем случае (и цикл будет сломан), то есть я ожидаю, что моя строка строки будет проанализирована, как последовательность a, , \n.

+0

Почему у вас есть точка с запятой после вашей петли? – byxor

+2

@BrandonIbbotson Использование цикла ограничено для увеличения 'cnt'. –

+0

@SouravGhosh Делает смысл. Благодарю. – byxor

ответ

1

При нажатии на + CTRL + Z, а затем нажмите ENTER, то CTRL + Z промывает вход (stdin) и следующий вход \n, который не является EOF. Вам нужно нажать CTRL + Z дважды, чтобы имитировать второе EOF.

+0

Я до сих пор не понимаю ... Значение '\ n' равно' 10', но я получаю '26'. –

+1

@ AndreyBushman как вы проверяете? –

+0

Я смотрю значения в окне * Watch * в MS Visual Studio. –

Смежные вопросы