Cin stoppt nicht?



  • Hallo,
    wir haben in der Schule ein Programm angefangen, das ganze ist ein ganz simpler "taschenrechner".

    Ich habe soweit auch alles hinbekommen, nur stehe ich im Menü vor einem Problem, welches ich mir nicht erklären kann.
    Ich habe ein Menü, bei dem mit Switch eine Rechenart abgefragt wird.
    Mit >> Cin frage ich dann die Rechenart ab...
    Das ganze ist in einer Schleife, gebe ich nun einen Buchstaben ein... zum Beispiel a oder f... dann wird das Programm in einer Endlosschleife neugestartet...

    Hier einmal die Funktion, vielleicht weiß ja einer wo der Fehler steckt...

    void auswahl ()
    {
    		int wahl;
    
    	do
    	{
    
    		begruessung();
    
    		cout << "Was moechten Sie tuen?" << endl;
    		cout << "1. Multiplizieren" << endl;
    		cout << "2. Dividieren" << endl;
    		cout << "3. Addieren" <<endl;
    		cout << "4. Subrahieren" << endl;
    		cout << "Auswahl: ";
    		fflush(stdin);
    		cin >> wahl;
    		fflush(stdin);
    
    		switch (wahl)
    		{
    		case 1: multiplikation(); break;
    		case 2: division(); break;
    	    case 3: addition(); break;
    		case 4: subtraktion(); break;
    		default: cout << "Bitte einen Wert zwischen 1 und 4 eingeben!";break;
    		}
    
    		system("cls");
    
    	}while(wahl != 1 || wahl !=2 || wahl !=3 || wahl!=4);
    }
    


  • sea-kay schrieb:

    Das ganze ist in einer Schleife, gebe ich nun einen Buchstaben ein... zum Beispiel a oder f... dann wird das Programm in einer Endlosschleife neugestartet...

    Hier einmal die Funktion, vielleicht weiß ja einer wo der Fehler steckt...

    Du solltest auch das fail-bit von cout prüfen und ggf. zurücksetzen (Dies wird z.B. gesetzt wenn die Eingabe nicht dem erwarteten Typ entspricht)...



  • Man kanns nicht oft genug wiederholen:
    flush ist nur für Outputstreams definiert. Bei Inputstreams produziert man sich undefiniertes Verhalten. Mal davon abgesehen ist fflush(stdin) auch C.
    So gehts besser:

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

  • Administrator

    Und vielleicht sollte man noch den Fehler erwähnen 😉

    int i;
    char c;
    std::cin >> i; // Es wird erwartet, dass eine Zahl eingegeben wird.
                   // Wenn zum Beispiel ein Buchstabe kommt -> Fehler.
    std::cin >> c; // Erwartet ein Buchstabe, also 'a' oder 'f' würde kein Fehler auslösen.
    

    Wenn bei std::cin , bzw. einem std::ostream oder std::istream ein Fehler passiert. Dann wird ein Fehlerbit gesetzt und jegliche Ein-/Ausgabe unterbunden und übersprungen.

    Grüssli


Anmelden zum Antworten