Problèmes avec la fonction C scanf (“% c”) pour lire les caractères un par un

Le code suivant produit un résultat très étrange lorsque je l’exécute.

#include  #include  int main(void) { for ( ; ; ) { char test; printf("Please enter 'w' "); scanf("%c", &test); printf("%c\n", test); if (test == 'w') { printf("Working\n"); } else { printf("ERROR\n"); return 0; } } } 

Ce que je veux, c’est que chaque fois que je saisis “w”, la boucle se poursuit afin que je puisse saisir à nouveau “w”. Ce que cela fait cependant, c’est d’aller à la déclaration else, même si je saisis ‘w’. Il semble simplement ignorer la ligne scanf() . J’ai demandé à tous ceux que je connais qui connaissaient C mais ils ne savaient pas comment le résoudre.

Quelqu’un s’il vous plaît aidez-moi ici!

En effet, vous tapez w suivi de ENTER . Donc, il y a 2 caractères dans l’entrée, 'w' , suivi d’une nouvelle ligne ( \n ). Ce dernier entraîne la prise de la twig else à la deuxième itération.

Notez que l’entrée standard est une ligne en mémoire tampon lorsqu’elle est connectée à un terminal. Si vous devez traiter avec des personnages immédiatement, il existe des moyens de le faire. Voir la FAQ comp.lang.c pour plus de détails (“Comment lire un seul caractère à partir du clavier sans attendre la touche RETURN? Comment puis-je empêcher les caractères d’être répercutés à l’écran lors de leur saisie?”).

Notez que pour une programmation robuste, il est indispensable de vérifier la valeur de retour de scanf . Il renvoie le nombre d’éléments convertis avec succès. Comme indiqué, votre code ne gère pas correctement le cas de fin de fichier, c’est-à-dire lorsque l’utilisateur tape Ctrl-D (en supposant qu’un terminal Unix est installé). Ensuite, scanf renvoie EOF et aucune conversion n’a été effectuée, mais vous utilisez test comme s’il contenait une valeur explicite.

comme dit Jens. vous devez ignorer la nouvelle ligne '\n'

Ajouter un espace au début du spécificateur de format " %c" ignorera la nouvelle ligne '\n'

 scanf(" %c", &test); 

L’utilisation de " %c" permet également d’ignorer d’autres espaces tels que \t space \b \v \r

Comme Jens le dit, vous devez utiliser '\n' , utilisez getchar() après scanf()

Vous devez faire quelque chose comme

  scanf("%c", &test); while(getchar()!='\n'); 

scanf prend les entrées jusqu’à l’espace ou \n (selon la première éventualité) et laisse le \n dans la mémoire tampon

juste curieux essayez-vous sur Windows? vous pouvez essayer flushall ();