
chanwcom
Wenn wir in der folgenden Schleife Zeichen als eingeben cin
anstelle der erwarteten Zahlen eingeben, dann geht es in eine Endlosschleife. Kann mir bitte jemand erklären, warum das passiert?
Wenn wir verwenden cin
wenn die Eingabe keine Zahl ist, gibt es dann Möglichkeiten, dies zu erkennen, um die oben genannten Probleme zu vermeiden?
unsigned long ul_x1, ul_x2;
while (1)
{
cin >> ul_x1 >> ul_x2;
cout << "ux_x1 is " << ul_x1 << endl << "ul_x2 is " << ul_x2 << endl;
}

Doug T.
Nun, Sie werden immer eine Endlosschleife haben, aber ich weiß, was Sie wirklich wissen wollen, ist, warum cin nicht bei jeder Schleifeniteration zur Eingabe auffordert, was dazu führt, dass Ihre Endlosschleife frei läuft.
Der Grund dafür ist, dass cin in der von Ihnen beschriebenen Situation fehlschlägt und keine weiteren Eingaben in diese Variablen liest. Indem man cin einen schlechten Input gibt, kommt cin ins Spiel Fehlerzustand und hört auf, die Befehlszeile zur Eingabe aufzufordern, wodurch die Schleife frei ausgeführt wird.
Für eine einfache Validierung können Sie versuchen, Ihre Eingaben mit cin zu validieren, indem Sie prüfen, ob cin im Fehlerzustand ist. Wenn ein Fehler auftritt klar den Fehler Zustand und zwingen den Stream dazu werfen Sie die schlechte Eingabe weg. Dadurch kehrt cin in den normalen Betrieb zurück, sodass Sie weitere Eingaben anfordern können.
if (cin.fail())
{
cout << "ERROR -- You did not enter an integer";
// get rid of failure state
cin.clear();
// From Eric's answer (thanks Eric)
// discard 'bad' character(s)
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Für eine ausgefeiltere Validierung möchten Sie möglicherweise zuerst in eine Zeichenfolge einlesen und die Zeichenfolge ausgefeilter prüfen, um sicherzustellen, dass sie Ihren Erwartungen entspricht.

Erich Z
Aufmerksamkeit
Bitte beachten Sie die folgende Lösung. Es ist noch nicht abgeschlossen, den Fehler in Ihrem Fall zu beheben. Sie erhalten immer noch eine Endlosschleife!
if (cin.fail())
{
cout << "Please enter an integer";
cin.clear();
}
Komplette Lösung
Der Grund dafür ist, dass Sie den fehlerhaften Status des Streams löschen und unverarbeitete Zeichen verwerfen müssen. Andernfalls ist der schlechte Charakter immer noch da und Sie erhalten immer noch Endlosschleifen. Sie können einfach std::cin.ignore() verwenden, um dies zu erreichen. Zum Beispiel,
if (cin.fail())
{
cout << "Please enter an integer";
// clear error state
cin.clear();
// discard 'bad' character(s)
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Eine andere Lösung
Sie können auch verwenden getline
und stringstream
erreichen. Hier ist ein kurzes Beispiel.
string input;
while (1)
{
getline(cin, input);
stringstream(input) >> x;
cout << x << endl;
}
Vielleicht liegt es daran,
- cin ist eine Streaming-Funktion. Wenn anstelle von Zahlen ein nicht numerischer Wert eingegeben wird, wird dieser ignoriert. Und Sie werden zur erneuten Eingabe aufgefordert.
- Auch wenn Sie numerische Eingaben gemacht haben, werden Sie zu weiteren Eingaben aufgefordert, da Sie sich in einer Endlosschleife befinden.
Sie können dieses Problem folgendermaßen lösen: 1. Erstellen Sie eine Funktion, um eine Zeichenfolgeneingabe aufzunehmen. 2. Geben Sie es nach der Konvertierung als numerisch zurück. Verwenden Sie strtod() für die Konvertierung.
Hoffe das hilft 🙂
Eine andere Alternative ist Operator! es ist äquivalent zur Mitgliedsfunktion Scheitern()
//from Doug's answer
if ( !cin )
{
cout << "ERROR -- You did not enter an integer";
// get rid of failure state
cin.clear();
// From Eric's answer (thanks Eric)
// discard 'bad' character(s)
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
9977200cookie-checkEndlosschleife mit cin beim Eingeben von Zeichenfolgen, während eine Zahl erwartet wirdyes