Problem mit while Schleife



  • Guten Morgen,

    wollte mir mit folgender while Schleife eine Absicherung gegen falsche Eingaben erstellen wenn man andere Zahlen außer 1, 2, 3 eingibt funktioniert sie auch jedoch wenn man einen buchstaben eingibt läuft er non stop mit falscher Eingabe durch (nur noch Abbruch möglich)

    double faktor_einlesen(void)
    {
    	int wahl;
    	bool falsche_eingabe;
    	double faktor = 0;
    
    	cout <<"Moechten Sie Ihre Anfangsgeschwindigkeit V0 in m/s (1) in km/h (2)"<<"\n"; 
    	cout <<"oder in mph (3) eingeben?"<<"\n";
    
    	falsche_eingabe = true;
    	while (falsche_eingabe)
    	{
    		cout <<"Bitte 1, 2 oder 3 eingeben: ";
    		cin  >> wahl;
    		if ( (wahl == 1) || (wahl == 2) || (wahl == 3) ) falsche_eingabe = false;
    		else cout << "Falsche Eingabe\n";
    	}
    
    	switch(wahl) // Auswahl auf Basis der eingegebenen Zahl
    	{
    		case '1':	 // Anwender hat 1 eingegeben
    			faktor = 1;					break;
    		case '2':	 // Anwender hat 2 eingegeben
    			faktor = 0.278;				break;
    		case '3':	 // Anwender hat 3 eingegeben
    			faktor = 0.467;				break;
    		default: 
    			faktor = 1;	
    	}
    
    	return faktor;
    }
    

    Irgendjemand ne Idee?

    Dankeschön!



  • Versuchs mal damit:

    cout <<"Bitte 1, 2 oder 3 eingeben: ";
    cin  >> wahl; 
    if(!cin) break;
    

    / Oder es an deinen Code anzupassen:

    if ( (wahl == 1) || (wahl == 2) || (wahl == 3) || (!cin) ) falsche_eingabe = false;
    


  • Habs jetzt mit deinem angepassten if...
    ausprobiert jetzt ist das Problem, dass wenn ich einen Buchstaben eingebe, er aus der Schleife rausspringt ins Hauptprogramm und den nächsten Befehl ausführt, er soll aber solang in der Schleife bleiben bis 1, 2 oder 3 eingegeben wird



  • cin befindet sich dann in einem Fehlerzustand, wenn du einen Buchstaben eingibst, obwohl ein Integer erwartet wird - du musst diesen Fehlerzustand aufheben und das letzte Zeichen im Puffer löschen, das du mit der Return-Bestätigung erzeugt hast:

    if(!cin) {
        cin.clear();
        cin.ignore(INT_MAX, '\n');
    }
    


  • Danke für die rasche Hilfe,

    das verstehe ich nicht ganz, wie binde ich das jetzt in meine Funktion ein (if Schleife) ?



  • Vll. so?

    bool falscheEingabe = true;
    size_t eingabe;
    while(falscheEingabe)
    {
     cout << "1, 2 oder 3? Ob du richtig stehst, erfährst du wenn das Licht an geht!" << endl;
     cout << "# ";
     cin >> eingabe;
     if((eingabe == 1) || (eingabe == 2) || (eingabe == 3))
      falscheEingabe = false;
     else if(!cin)
     {
      cin.clear();
      cin.ignore(INT_MAX, '\n'); // Warum INT_MAX?
     }
     else 
      cout << "falsche Eingabe." << endl;
    }
    

Anmelden zum Antworten