2010-10-06 4 views
1

Pourquoi la boucle suivante est-elle infinie lorsqu'une mauvaise entrée est entrée? Comment est-ce que je corrige ceci?alors que la boucle boucle indéfiniment lorsque la mauvaise entrée est entrée

int operation; 
    while (true) { 
     cout << "What operation would you like to perform? Enter the number corresponding to the operation you would like to perform. "; 
     cin >> operation; 
     if (operation >= 1 && operation <= 5) break; 
     cout << "Please enter a number from 1 to 5, inclusive.\n"; 
    } 
+0

Cela ressemble beaucoup à une question que vous avez posée récemment. Qu'est-il arrivé à l'autre question? –

+0

Ah, ce n'est pas la même personne qui l'a posté. Cela explique pourquoi je ne pouvais pas le trouver! –

Répondre

0

Si vous avez une entrée que cin ne peut pas analyser, le flux sera dans un état d'erreur.

Voici un exemple de la façon dont vous pouvez effacer l'état d'erreur, puis ignorer l'entrée:

int operation; 
while (true) { 
cout << "What operation would you like to perform? Enter the number corresponding to the operation you would like to perform. "; 
     cin >> operation; 
     if (cin.fail()) 
     { 
      cout << "Not a number " << endl; 
      cout << "Please enter a number from 1 to 5, inclusive.\n"; 
      cin.clear(); 
      cin.ignore(100, '\n'); 
      cin >> operation; 
     } 
     if (operation >= 1 && operation <= 5) break; 
     cout << "Please enter a number from 1 to 5, inclusive.\n"; 
    } 

Notez qu'il est important d'effacer l'état d'erreur du flux d'entrée avant d'essayer d'ignorer la mauvaise personnages. Espérons que cela aide--

+0

Lorsque la fin de l'entrée est atteinte, cette réponse lit à partir de la mémoire non initialisée et passe ensuite dans une boucle infinie. –

3

Après qu'une erreur est survenue sur le flux d'entrée, le flux sera dans un état d'échec. Vous devez explicitement effacer les bits d'échec sur ce flux et le vider ensuite. Essayez:

#include <limits> 
#include <iostream> 

... 
... 
// erroneous input occurs here 

std::cin.clear(); 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

Vous pouvez vérifier si l'entrée a soulevé une erreur en vérifiant la valeur de retour du bien(), mauvais(), ne parviennent() ou EOF(). Ces fonctions renvoient simplement l'état des bits d'état interne (c'est-à-dire vrai si le bit correspondant est défini - à l'exception de good(), évidemment, ce qui retournera vrai si tout est en ordre).

+0

cela fonctionne mais quand j'entre une entrée correcte, je dois appuyer sur entrer deux fois pour recevoir l'invite suivante. Comment puis-je éviter cela, alors je n'ai besoin d'entrer qu'une seule fois? – idealistikz

+1

J'ai déjà répondu à cette question: Vérifiez si une erreur s'est produite et * seulement ensuite * effacer le flux. –

Questions connexes