странное поведение printf () внутри цикла while
Может ли кто-нибудь объяснить мне, почему я вижу двойной вход функции printf () цикл while:
#include <ctype.h>
#include <stdio.h>
int main(){
int x = 0;
while ( x != 'q'){
printf("nEnter a letter:");
x=getchar();
printf("%cn", x);
if( isalpha(x) )
printf( "You entered a letter of the alphabetn" );
if( isdigit(x) )
printf( "You entered the digit %cn", x);
}
return 0;
}
Выходные данные кода в Debian Squeeze (GCC версии 4.4.5 (Debian 4.4.5-8)):
Enter a letter:1
1
You entered the digit 1
Enter a letter: // why is the first one appearing ???
Enter a letter:2
2
You entered the digit 2
4 ответа:
Первый из них считывает символ конца строки, введенный при нажатии клавиши Enter после 1 (конец строки останется в буфере ввода).
Вы можете проверить это, добавив ветку else:
#include <ctype.h> #include <stdio.h> int main() { int x = 0; while ( x != 'q') { printf("\nEnter a letter:"); x = getchar(); printf("%c\n", x); if( isalpha(x) ) printf( "You entered a letter of the alphabet\n" ); else if( isdigit(x) ) printf( "You entered the digit %c\n", x); else printf("Neither letter, nor digit: %02X\n", x); } return 0; }
Вывод:
Enter a letter:1 1 You entered the digit 1 Enter a letter: Neither letter, nor digit: 0A Enter a letter:2
Байт
0A
является символом перевода строки.
Во второй раз через цикл
getchar()
получает Enter после первого введенного символа.Вы могли бы сделать что-то вроде
while ((c = getchar()) != EOF && c != '\n') {} /* eat the rest of the line */
Чтобы избавиться от всего, вплоть до следующего Введите после получения символа и перед тем, как попросить другой.
Если вы хотите проверить символы при вводе немного продвинутый метод будет изменить поведение stdin в необработанном режиме.Затем, как только пользователь нажмет символ, вы получите его в своей переменной. Проверьте это для некоторого начала