Schleifenproblem cin.fail()



  • Hi,
    ich wollte eine Ueberpruefung mit cin.fail machen um zu testen ob der Benutzer eine Zahl oder Zeichen eingegeben hat und falls er keine Zahl eingegeben hat, soll dass Menue noch einmal angezeigt werden mit der Nachricht, dass er eine Zahl eingeben soll.

    Mein Problem ist allerdings, dass wenn ich diesen Code ausfuehre und einen Buchstaben eingebe, die while-Schleife sich endlos wiederholt ohne dass ich darauf Einfluss nehmen kann.

    do {
    		do {
    			system("clear");
    
    			if( cin.fail( ) ) {
    				cout << "Bitte geben Sie eine Zahl ein!";
    				cin.clear( );
    				cin.ignore( cin.rdbuf( )->in_avail( ) );
                		} 
    
    			cout << "  \n\t\t\tSchul-Datenbank\n";
    			cout << "  \t\t===============================\n\n";
    			cout << "  Menue:\n\n";
    			cout << "  1 - Schueler\n";
    			cout << "  2 - Lehrer\n";
    			cout << "  3 - Unterricht\n";
    			cout << "  0 - Exit\n\n";
    
    			cout << "  Bitte Waehlen Sie einen Menuepunkt: ";
    			cin >> menue;
    		}
    		while( cin.fail() );
    
    	}
    	while( menue != 0 && menue != 1 && menue != 2 && menue != 3);
    

    Rgds
    Coda



  • Hmm nochmal damit es nun alle kapieren:

    std::istream& clear_stream(std::istream& in) { in.clear(); in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); return in; }
    
    do {
        std::system("cls");
    
        std::cout << "  \n\t\t\tSchul-Datenbank\n"
                  << "  \t\t===============================\n\n"
                  << "  Menue:\n\n"
                  << "  1 - Schueler\n"
                  << "  2 - Lehrer\n"
                  << "  3 - Unterricht\n"
                  << "  0 - Exit\n" << std::endl;
    
        std::cout << "Auswahl: ";
    } while(!(clear_stream(std::cin) >> menu) || menu > 3 || menu < 0);
    

    Und fertig.



  • Eigetl. sehr gut, nur wird die Erste Eingaben die getaetigt wird immer ignoriert.

    Also, wenn ich in das Menue komme und z.B. 1 eingebe, geht er in die nachste Zeile und wartet auf eine erneute Eingabe, obwhol 1 ja korrekt ist. Danach funktioniert es perfekt, nur halt beim 1. mal ignoriert er alles was ich eingebe.

    Rgds
    Coda


Anmelden zum Antworten