2010-11-14 39 views
2

Je travaille actuellement sur un programme C++ et je veux vérifier si l'entrée que l'utilisateur est en train de faire est valide. Actuellement, mon code fonctionne si l'utilisateur entre l'entrée correcte ou si l'utilisateur entre un petit nombre incorrect, mon programme indiquera à l'utilisateur que l'entrée est invalide. Maintenant, mon problème est que lorsque l'utilisateur entre plusieurs caractères/lettres ou un grand nombre de 9 chiffres ou plus, mon programme passe dans une boucle infinie en leur donnant le message d'erreur. Ce qui suit est mon code:Vérification de l'entrée valide

//for (;;) 
    while (flag== false) 
    { 
     cin >> Input; 
     if (Input <= choice.size()-1) 
     { 
      flag = true; 
    // break; 
     } 

     else 
     { 
      cerr << "Input <" << Input << "> is Invalid, Please Choose a Valid Option\n"; 
      userInput = 0; 
     } 
    } 

Comme vous pouvez le voir, je l'ai aussi essayé de faire une boucle infinate mais il me donne les mêmes résultats. Dans mon code, j'imprime un vecteur à l'écran. Fondamentalement, l'utilisateur choisit la valeur des vecteurs pour l'utiliser.

Je suis ouvert à toutes suggestions. Merci

+0

double possible de [? Comment puis-je valider l'entrée d'utilisateur en tant que double en C++] (http://stackoverflow.com/questions/3273993/how-do-i-validate-user -input-as-a-double-in-c) – casablanca

Répondre

2

Si les types d'utilisateur dans quelque chose qui ne peut être lu dans Input (on ne sait pas à partir de votre code quel type Input est), cette entrée sera bloquée dans le flux d'entrée et chaque itération de la boucle gardera défaut lire dans l'entrée jusqu'à ce que vous effaciez le flux.

Vous devez effacer les indicateurs de flux et vous débarrasser de toute mauvaise entrée en attente dans le flux après chaque échec de lecture. Essayez quelque chose comme ceci:

while(!(cin >> Input) || Input <= choice.size()-1) 
{ 
    cerr << "Input <" << Input << "> is Invalid, Please Choose a Valid Option\n"; 
    cin.clear(); // Clears the input stream fail flag 
    cin.ignore(100, '\n'); // Ignores any characters left in the stream 
} 
+0

'cin.sync()' est une meilleure option que de spécifier une valeur codée en dur telle que 100. – casablanca

+0

Est-ce que 'sync' fonctionne de façon portative? http://www.cplusplus.com/reference/iostream/istream/sync/ est moins clair sur ce que l'on appelle 'sync' sur' cin', et les commentaires sur http://stackoverflow.com/questions/3273993/how-do-i-validate-user-input-as-a-double-in-c n'est pas trop encourageant. – user168715