Einfache Funktion geht in Endlos-Schleife???



  • Hallo,
    ich versuche gerade C++ zu lernen 👍 .
    Dabei habe ich untenstehende Funktion geschrieben.

    Mit dem Aufruf der Fuktion möchte ich eine Zahl vom Benutzer abfragen.
    Um eine Fehleingabe abzufangen (z.B. Eingabe eines Buchstaben (char statt float) habe ich eine do-while-Schleife eingefügt, die solange durchlaufen werden soll, bis die Eingabe korrekt ist (Eingabe einer Zahl --> cin.good() = 1).
    Leider funktioniert es nicht so wie ich es mir vorgestellt habe. Wenn man einen Buchstaben eingibt, kommt man in eine Endlos-Schleife.

    Die Funktion gibt den Text "Eingabe falsch. Bitte Eingabe wiederholen:" aus. Mann kann aber keine neue Eingabe machen.

    Was mache ich falsch 😕 ???

    =======================
    Quellcode der Funktion

    float Benutzerabfrage()
    {
    	float x = 0;
    	int i = 0;
    	do
    	{
    		cin >> x;
    		if(cin.good())
    		{
    			cout << "Eingabe in Ordnung" << endl;
    			cout << "Status: " << cin.good() << endl;
    		}
    		else
    		{
    			cout << "Eingabe falsch. Bitte Eingabe wiederholen: " << endl;
    			x = 0;
    			i++;
    			cout << "Status: " << cin.good() << endl;
    			cout << "Durchlauf Nr.: " << i << endl;
    		}
                      if(i>20) break; // Abbruch der Endlos-Schleife
    	}
    	while(!cin.good());
    	return x;
    }
    


  • ich denke das liegt an deinem cin.good(), da wurde schon mal drüber diskutiert hier

    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1842971.html



  • CTecS schrieb:

    ich denke das liegt an deinem cin.good(), da wurde schon mal drüber diskutiert hier

    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1842971.html

    Hallo CTecS,
    vielen Dank für die rasche Antwort 🙂 .
    Ich habe unter dem Link, den du mir empfohlen hast, die Lösung gefunden.

    Ich musste lediglich vor der Abfrage alle Flags zurückgesetzen und alle ungültigen Zeichen, welche noch im Puffer liegen, löschen.
    --> Tip von Dravere (Moderator) am 22.01.2010:
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());

    float Benutzerabfrage()
    {
    	float x = 0;
    	int i = 0;
    	do
    	{
    		cin.clear();
    		cin.ignore(cin.rdbuf()->in_avail());
    		cin >> x;
    		if(cin.good())
    		{
    			cout << "Eingabe in Ordnung" << endl;
    			cout << "Status: " << cin.good() << endl;
    		}
    		else
    		{
    			cout << "Eingabe falsch. Bitte Eingabe wiederholen: " << endl;
    			x = 0;
    			i++;
    			cout << "Status: " << cin.good() << endl;
    			cout << "Durchlauf Nr.: " << i << endl;
    		}
    		if(i>20) break;
    	}
    	while(!cin.good());
    	return x;
    }
    

Anmelden zum Antworten