Question

Quelqu'un peut-il m'expliquer pourquoi je vois une double entrée de la fonction printf () la boucle while:

#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" );
    if( isdigit(x) )
      printf( "You entered the digit %c\n", x);
    }   
    return 0;
}

La sortie du code dans Debian Squeeze (GCC version 4.4.5 (Debian 4.4.5-8)) est:

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
Était-ce utile?

La solution

Le premier lit le caractère de terminateur de ligne que vous avez entré lorsque vous appuyez sur Entrée après 1 (le terminateur de ligne restera dans le tampon d'entrée).

Vous pouvez le vérifier en ajoutant une branche 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;
}

Le résultat:

Enter a letter:1
1
You entered the digit 1

Enter a letter:

Neither letter, nor digit: 0A

Enter a letter:2

L'octet 0A est le personnage d'alimentation de ligne.

Autres conseils

La deuxième fois à travers la boucle, getchar() obtient le Entrer Après le premier personnage, vous avez entré.

Tu pourrais faire quelque chose comme

while ((c = getchar()) != EOF && c != '\n') {} /* eat the rest of the line */

pour se débarrasser de tout jusqu'à et y compris le prochain Entrer Après avoir obtenu un char et avant d'en demander un autre.

Si vous souhaitez vérifier les caractères lorsque vous entrez une technique légèrement avancée serait de changer le comportement de Stdin en mode brut. Ensuite, dès que l'utilisateur frappe un char, vous obtenez cela dans votre variable.Vérifiez ceci pour un début

Utilisation CTRL + D Pour obtenir la fonctionnalité du caractère Newline sans son effet secondaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top