Это потому, что вы набираете w, а затем ENTER. Таким образом, на входе есть 2 символа, 'w'
, а затем новая строка (\n
). Последнее приводит к тому, что ветвь else
берется на второй итерации.
Обратите внимание, что стандартный вход буферизируется при подключении к терминалу. Если вам нужно немедленно обратиться к персонажам, есть способы сделать это. Подробнее см. В comp.lang.c FAQ («Как я могу прочитать один символ с клавиатуры, не дожидаясь клавиши RETURN? Как я могу остановить отображение символов на экране, re typed? ").
Обратите внимание, что для надежного программирования необходимо проверить возвращаемое значение scanf
. Он возвращает количество успешно преобразованных элементов. Как показано, ваш код не обрабатывает случай с конечным файлом правильно, т. Е. Когда пользователь набирает Ctrl-D (при условии, что терминал Unix). Затем scanf возвращает EOF
, и преобразование не выполнялось, но вы используете test
, как если бы оно содержало значимое значение.