2017-04-04 7 views
0

Hey all dies ist mein Codetry catch Wiederholung Schleife

void Student::studentMenu() { 
    int choiceInput; 
    const string ErrorMsg; 
    cout << "-------------Student Menu--------------" << endl; 
    cout << "(1)Start Quiz" << endl; 
    cout << "(2)View History Score Table" << endl; 
    cout << "(0)Exit" << endl; 
    cout << "Option: " << endl; 
    try { 
     cin >> choiceInput; 

     if (choiceInput < 0 || choiceInput>2 || !cin) 
     { 
      throw (ErrorMsg); 
     } 

     while (choiceInput != 0) { 
      switch (choiceInput) { 
      case 1: 
       generateQuiz(); 
       break; 
      case 2: 
       break; 
      case 0: 
       break; 
      } 
      break; 
     } 
    } 
    catch (string msg) 
    { 
     cout << "Please only enter valid integer from 0-3" << endl; 
     Student::studentMenu(); 
    } 
} 

Im Grunde ist es die Benutzereingabe überprüft und eine Ausnahme aus, wenn seine eine nicht ganze Zahl größer als 3. Nachdem die Fehlermeldung angezeigt wird, sollte es umgeleitet zurück die Studentenmenü() Seite. Die Ausgabe ist beabsichtigt, wenn ich eine Ganzzahl wie 5 eingib, aber wenn ich ein Zeichen 'f' eintrage, wiederholt es die Fehlermeldung

Bitte helfen Sie mir danke!

Antwort

3
cin >> choiceInput; 

Was passiert, wenn die Eingabe keine parsable ganze Zahl ist, wird cin nicht automatisch über überspringen. Das bedeutet, dass Sie bei diesem Wert hängen bleiben: Sie versuchen, es zu lesen, es schlägt fehl, Sie gehen eine Iteration tiefer, Sie versuchen, es zu lesen, es schlägt fehl usw. Um das zu beheben, sollten Sie die falschen Zeichen ignore falsch lesen (zB !cin gibt wahr zurück). Typischerweise etwa so aussehen, würde dies:

if (!cin) { 
    cin.clear(); 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} //proceed 

(cin.clear() erforderlich, um die failbit zu löschen, so dass !cin wieder falsch wird)

+0

Sie sind ein Genie! Danke, dass es jetzt funktioniert –

+0

@NewbieICTIS Gern geschehen. –

0

Sie benötigen Sie choiceInput Variable mit einem ungültigen Wert initilize:

int choiceInput = -1; 

Und Sie verwenden cout.flush() sicher sein zu fangen, dass Sie die Puffer reinigen, bevor zu studentMenu() Aufruf:

catch (string msg) 
    { 
    cout << "Please only enter valid integer from 0-3: " << choiceInput << endl; 
    cout.flush(); 
    } 
+0

nicht –

+0

@NewbieICTIS nicht work..still Looping bearbeitet! – Rama

0

choiceInput ist eine Ganzzahl und der ASCII-Wert von 'f' ist 102, was> 2 ist. Ich würde empfehlen, dass Sie einige weitere checks auf choiceInput hinzufügen, um sicherzustellen, dass es sich um eine Ganzzahl und nicht um ein Zeichen handelt.

Siehe

How to check if input is numeric in C++

+0

da der Wert 102 ist, fällt es immer noch wie 10 in den ungültigen Eingang, aber warum schleift es? es passiert nicht bis 10 obwohl .. und yep ich muss versuchen und Ausnahme für diese –