2010-05-10 3 views
2

J'essaye d'avoir une boucle continue d'inviter l'utilisateur pour une option. Quand je reçois une chaîne de caractères au lieu d'un int, le programme boucle indéfiniment. J'ai essayé de mettre le résultat de la variable à NULL, en effaçant le flux d'entrée, et j'ai inclus dans try {} catch blocks (pas dans cet exemple). Quelqu'un peut-il m'expliquer pourquoi c'est?Est-ce que la boucle est interrompue après une saisie incorrecte?

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

int menu(string question, vector<string> options) 
{ 
    int result; 

    cout << question << endl; 

    for(int i = 0; i < options.size(); i++) 
    { 
     cout << '[' << i << ']' << options[i] << endl; 
    } 

    bool ans = false; 
    do 
    { 
     cin >> result; 
     cin.ignore(1000, 10); 
     if (result < options.size()) 
     { 
      ans = true; 
     } 
     else 
     { 
      cout << "You must enter a valid option." << endl; 
      result = NULL; 
      ans = false; 
     }  
    } 
    while(!ans); 
    return result; 
} 

int main() 
{ 
    string menuQuestion = "Welcome to my game. What would you like to do?"; 
    vector<string> mainMenu; 
    mainMenu.push_back("Play Game"); 
    mainMenu.push_back("Load Game"); 
    mainMenu.push_back("About"); 
    mainMenu.push_back("Exit"); 

    int result = menu(menuQuestion, mainMenu); 
    cout << "You entered: " << result << endl; 
    return 0; 
} 
+0

double possible de [While avec prise d'essai échoue à mauvaise entrée cin] (http://stackoverflow.com/questions/2292202/while-loop-with-try-catch-fails-at-bad-cin-input) – kennytm

+0

Préférez les caractères entre guillemets plutôt que leurs équivalents décimaux. Ainsi 'cin.ignore (1000,10)' devient le 'cin.ignore (1000, '\ n')' plus lisible. –

Répondre

2

Il semble qu'il y ait un élément aléatoire ici, puisque result n'est pas initialisé.

Dans tous les cas, le test cin directement

if (cin && result < options.size()) 

et réinitialiser lors de l'entrée invalide donc il sera à nouveau effectuer des opérations d'E/S

 result = 0; // inappropriate to initialize an integer with NULL 
     cin.clear(); // reset cin to work again 
     cin.ignore(1000, '\n'); // use \n instead of ASCII code 
+0

Merci beaucoup. Cela a fonctionné. –

+0

vous pourriez être intéressé par ce [proposition de la pile-échange] (http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2 "Code Review"). – greatwolf

Questions connexes