Endlosschleife mit cin beim Eingeben von Zeichenfolgen, während eine Zahl erwartet wird

Lesezeit: 4 Minuten

Endlosschleife mit cin beim Eingeben von Zeichenfolgen wahrend eine Zahl
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 cinwenn 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;
}

Endlosschleife mit cin beim Eingeben von Zeichenfolgen wahrend eine Zahl
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.

  • Oder noch besser, ein Stringstream.

    – Maxpm

    3. Mai 2011 um 3:48 Uhr

  • Wenn ich cin.clear() aufrufe, nachdem cin fehlgeschlagen ist, warum fragt es dann immer noch nicht nach einer Eingabe, wenn ich das nächste Mal cin >> x aufrufe?

    – Eric Z

    3. Mai 2011 um 4:02 Uhr


  • Diese Antwort behebt das Problem, das OP so wie es ist, nicht unvollständig. Bitte schau dir meine Antwort an 🙂

    – Eric Z

    3. Mai 2011 um 5:31 Uhr

  • @Eric, ich habe den Fehler in meiner Antwort behoben. Danke für den Hinweis.

    – Doug T.

    3. Mai 2011 um 12:36 Uhr

  • @Almo, Sie werden wahrscheinlich verbrannt, weil max ein Makro ist, das irgendwo in windows.h definiert ist. Es überschreibt also, was in der C++ Std Lib ist. Versuchen Sie es zu tun #undef max Vor dem cin.ignore und sehen was passiert.

    – Doug T.

    18. Juli 2012 um 14:30 Uhr

1647176409 284 Endlosschleife mit cin beim Eingeben von Zeichenfolgen wahrend eine Zahl
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;
   }

  • Denken Sie daran, dass das Programm mit der Eingabe fortfährt, auch wenn Sie diese Funktionen aufrufen. Sie müssen das alles in eine while()-Schleife werfen und aufrufen cin auf der Eingabe am Ende.

    Benutzer15114051

    17. Dezember 2021 um 8:04 Uhr

Vielleicht liegt es daran,

  1. 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.
  2. 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');
}

997720cookie-checkEndlosschleife mit cin beim Eingeben von Zeichenfolgen, während eine Zahl erwartet wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy