Endlosschleife durch falsche Eingabe. - Alternative zu cin?



  • Ich hab das Spiel "Schiffe Versenken" für die Konsole geschrieben und bin grad dabei einige Bugs zu entfernen.
    Meine Menüs habe ich in Schleifen gepackt, die sich solange wiederholen bis eine richtige Auswahl getroffen wird.

    do
    {
    	cout<<"1 - Spiel starten\n";
    	[...]
    	cout<<"6 - Spiel beenden\n";
    	cout<<"Auswahl:";
    	cin>>Auswahl;
    	cout<<endl;
    	switch (Auswahl)
    	{
    	case(1):
    		{
    			Spiel.Spiel_Starten();
    		}break;
    	[...]
    	default:
    		{
    			cout<<"Falsche Eingabe!\n";
    		}break;
    	}//Switch
    
    }while (Auswahl!=6);
    

    Das Problem ist nur, wenn man ausversehen einen Buchstaben eingibt, verwandelt es sich gleich in eine Endlosschleife.
    Ich kann das nicht ganz nachvollziehen, warum ich beim nächsten Schleifendurchlauf keine Möglichkeit mehr habe meine Eingabe zu korrigieren.
    Kann ich das vll. vermeiden, in dem ich etwas anderes verwende als cin? Wenn ja - was am besten?
    Bin für jede Hilfe dankbar!
    Snib



  • Es könnte sein, dass nach der Eingabe noch ein EOL (Enter) im Eingabepuffer steckt. Du kannst ja mal vor Ende der while-Schleife ein cin.ignore(); einfügen. Wenn da nicht geht, auch mal das hier versuchen.

    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    


  • Bei dir wird anscheinend eine Zahl als Eingabe erwartet.
    Um auch andere Eingaben abzufangen, muss die Eingabe in einer Variable des Typs 'char' gespeichert werden. Diese kannst du dann, wie in deinem Code schon angedeutet, mit anderen Werten vergleichen, und gegebenenfalls einen default - Wert setzen, der falsche Eingaben abfängt.

    Das Problem ist nur, dass in einer Variable des Typs 'char' nur ein Zeichen gespeichert wird, das heißt, dass dein Programm bei der Eingabe von 2 oder mehr Zeichen ebenfalls ein ungewolltes Verhalten zeigt... Probiers mal aus 😉

    Bobby - Karle



  • Wenn du mit cin >> auswahl ein integer lesen willst und einen buchstaben eingibst dann wird bei cin das failbit gesetzt und alle drauffolgenden eingaben scheitern. du kannst das failbit mit cin.clear() wieder löschen.
    Kurt

    EDIT: Sorry hab die vorherigen posts nicht richtig gelesen. Braunstein hat es schon gesagt.



  • Die vorgeschlagene Lösung von Braunstein funktioniert super!
    Danke auch an alle anderen.

    snib




Anmelden zum Antworten