[C++] seltsame Endlosschleife (std::cin promlem?)

D

DrHastig


Moin,

ich habe mein Problem bereits gelöst aber ich verstehe meine eigene Lösung nicht -_-

Ich habe in einem Miniprog ca. folgenden Codeaufbau.
C++:
int main()
{
    int auswahl(0);
    bool ende(false);
    std::string str1(""), str2("");
	
    do
    {
        //auswahl = 0; Ohne die Anweisung kommts zur Endlosschleife

        std::cout << ...;
        std::cin >> auswahl;

        switch(auswahl)
        {
        case 1:
            ende = false;
            std::cin.ignore();
            getline(std::cin, str1);
            ...
            [Manipulation der Strings]
            ...
			
            break;
		
        case 2:
            ende = false;
            std::cin.ignore();
            getline(std::cin, str2);
            ...
            [Manipulation der Strings]
            ...
			
            break;

        default:
            ende = true;

            std::cout << "\nProgramm wird beendet!" << std::endl;

            break;
        }
        std::cout << std::endl << std::endl;
    } while(!ende);

    return 0;
}

Wenn ich im ersten Druchlauf einen Buchstaben eingebe, dann wird das Programm so wie es soll beendet.
Wenn ich im ersten Druchlauf so wie mans soll eine Zahl eingebe und im zweiten einen Buchstaben, dann löst dies eine Endlosschleife aus in der nichtmals eine neue Auswahl angefragt wird.

Das Problem habe ich gelöst indem ich die Variabel auswahl wieder = 0 setze bevor ich sie einlese.

Frage ist nun warum funktioniert das so? Ich find es immer nerfig wenn man seine eigenen Lösungen nicht versteht -_-
 
Zuletzt bearbeitet von einem Moderator:
Hi.

Wenn du einen Buchstaben eingibst, schlägt die Anweisung cin >> auswahl fehl. Der Stream befindet sich danach in einem Fehlerzustand. Von einem solchen Stream kann nichts mehr eingelesen werden. D.h. heißt alle möglichen Operationen auf dem Stream haben keine Wirkung und die Variable auswahl wird nie mehr verändert (da auch nichts mehr eingelesen wird).

Versuch's mal lieber so:
C++:
do {
  if (cin >> auswahl) { // prüfen ob erfolgreich!
    switch (auswahl) {
       ...
    }
  } else if (!cin.bad() && cin.eof()) { // prüfen ob Stream wieder 
                                        // zurückgesetzt werden soll
    cin.clear(); // Stream wieder auf Zustand "good" setzen
  }
} while (cin && !ende); // Abbruch wenn ende == true oder cin nicht mehr lesbar
Gruß
 
Warum befindet sich std::cin in einem Fehlerzustand wenn man einen Buchstaben eingibt?

Noch eine kleine Frage zwischendurch die jetzt nichts mit dem Problem zu tun hat.

Wie kann ich eine Betriebssystembedingte Compilierung bewirken?
Also ich würde gerne sowas in der Art machen:
C++:
#ifdef WINDOWS
    #define DIR_SEPARATOR '\\'
#endif
#ifdef LINUX
    #define DIR_SEPARATOR '/'
#endif
#else
    #error Unbekanntes System
#endif
 
Zuletzt bearbeitet von einem Moderator:
Warum befindet sich std::cin in einem Fehlerzustand wenn man einen Buchstaben eingibt?
Es ging um die Anweisung cin >> auswahl. Da die Variable auswahl ein int ist, sind Buchstaben beim Einlesen vom Stream keine gültigen Zeichen (außer bei hexadezimaler Eingabe, dann aber nur a bis f). Wenn man ungültige Zeichen eingibt schlägt die formatierte Eingabe fehl und der Stream befindet sich im Zustand fail.

Gruß
 
Bei einer formatierten Eingabe mit den >> Operatoren muss die Eingabe ein bestimmtes Format haben. Alles andere wäre Unsinn...
Gruß
Ah ok das macht Sinn. Ich dachte das wäre eine normale Eingabe wo es egal ist was da kommt.

Aber was mich noch interessieren würde ist warum es funktioniert hat wenn ich auswahl = 0; vor die Eingabe gestellt hab.

Edit: Weil der Wert von auswahl = 0 ist und er dann bei einem Fehler ins default geht und so aus der Schleife raus. Irgendwie übersehen^^
 
Zuletzt bearbeitet von einem Moderator:
Zurück