странное поведение 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 3

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 в необработанном режиме.Затем, как только пользователь нажмет символ, вы получите его в своей переменной. Проверьте это для некоторого начала

Используйте CTRL + D, чтобы получить функциональность символа новой строки без его побочного эффекта.