C: Boucle répétitive trop longue!

J’ai un petit programme qui me déroute. J’essaie d’utiliser une boucle pour prendre les commentaires de l’utilisateur. Si la saisie est fausse, elle est répétée mais si elle est correcte, elle est supprimée. L’extrait de code est:

 void main() { char user_status; // Checks User Status q = Quiz Master and p = Participant int valid_status = '0'; // Checks If User Status Is Valid Or Not. Used In Some Loops. 0 = Invalid, 1 = Invalid. printf("Welcome to General Knowledge Quiz Management System.\nThis application has been designed to help you conduct a quiz or test your GK."); do { user_status = '0'; printf("\n\nPlease enter your role.\nQuiz Master = \'q\'\nParticipant = \'p\'\n"); scanf("%c", &user_status); if (user_status == 'q'|| user_status == 'Q') { printf("Initializing Quiz Master Segment\n\n________________________________\n"); initiate_qm(); valid_status = '1'; } else if (user_status == 'p' || user_status == 'P') { printf("Initializing Participant Segment"); initiate_pa(); valid_status = '1'; } } while (valid_status != '1') printf("\nProgram Will Exit Now. Press Any Key To Return To Windows."); getch(); } 

J’attends cette sortie:

 Please Enter Your Role Quiz Master = 'q' Participant = 'p' 

Jusqu’à présent, cela fonctionne très bien. Lorsque je saisis q / Q / p / P, cela fonctionne très bien. Mais lorsque je saisis quelque chose de mal, cela ne donne pas la sortie requirejse.

Par exemple, si je saisis “abc”, je devrais obtenir à nouveau le texte ci-dessus me demandant de saisir q ou p. Mais au lieu de cela, je reçois ceci:

  Please Enter Your Role Quiz Master = 'q' Participant = 'p' Please Enter Your Role Quiz Master = 'q' Participant = 'p' Please Enter Your Role Quiz Master = 'q' Participant = 'p' Please Enter Your Role Quiz Master = 'q' Participant = 'p' _ (I have to input here) 

Maintenant, pourquoi répète-t-il 3 fois de plus? Une chose intéressante à noter est que si je saisis quelque chose qui fait 2 caractères de long, il répète 2 fois de plus et si je le laisse vide (appuyez simplement sur retour), il ne se répète pas de temps supplémentaire.

Je dois utiliser uniquement C. J’utilise Visual C ++ 2010 pour comstackr.

Merci.

Parce que vous avez donné à scanf trois caractères à traiter. Il supprime le premier premier caractère la première fois qu’il appelle scanf en obtenant “a”, mais il rest toujours “bc” dans la mémoire tampon stdin.

Vous devez vérifier les rests dans votre tampon avant de chercher à nouveau une entrée. Et j’éviterais de vider le tampon stdin parce que c’est un comportement indéfini. (http://www.gidnetwork.com/b-57.html)

Vous pouvez lire les caractères restants et les supprimer avec

 do{ scanf("%c", &user_status); }while(user_status!='\n'); //This discards all characters until you get to a newline 

juste après avoir lu le caractère que vous voulez.

Tu veux

 do { } while (condition); 

Lorsque vous avez oublié le point-virgule, vous obtenez:

 do { .... } while(condition) do something else; 

Vous auriez pu le remarquer en mettant simplement votre code en place dans un éditeur, comme je l’ai fait pour votre question.

De même, lorsque vous effectuez un scanf vous devriez plutôt inclure le \n dans la spécification de format.

Tout d’abord, # include et utilisez getc(stdin) pour obtenir un caractère. Cela vous aidera à empêcher le curseur de bouger et à mettre des caractères inutiles sur la console. Deuxièmement, écrivez le message de bienvenue avant la boucle.