2017-01-05 6 views
-3

Ich versuche, einen Code zu schreiben, um Benutzereingaben von cin anzufordern.Aufforderung Benutzereingabe, bis C++ korrekt ist

int main() 
{ 
    int year; 
    cout << "Enter a valid year: "; 
    cin >> year; 

    while (cin.fail()) 
    { 
     cout << "Re-enter a valid value! "; 
    } 
} 

Allerdings hält der Compiler das Drucken der Zeile „Re-geben Sie einen gültigen Wert!“ Unterminatedly, wenn ich eine nicht-Integer-Typ eingeben. Ich weiß nicht, was an meinem Code falsch ist! Kann jemand bitte das korrigieren? Vielen Dank.

+0

So viele Fragen ... warum tut „der Compiler print“ alles für das Lernen?

Compiler machen das nicht. Und warum "ein * gültiges * Jahr" eingeben? Warum nicht einfach "ein Jahr eingeben"? Wann müssten Sie jemals angeben, dass Sie etwas * Gültiges * wollen? –

+0

@KerrekSB: Es tut mir leid für mein mangelndes Verständnis der Terminologien, aber können Sie angeben, was in meinem Code geändert werden muss? – bffaf01

+0

Das sieht wie ein Duplikat aus: http://stackoverflow.com/questions/5655142/how-to-check-if-input-is-numeric-in-c/5655685#5655685 – ebyrob

Antwort

4

Try this:

bool done = false; 
int year; 

for (std::string line; 
    std::cout << "Enter a year: " && std::getline(std::cin, line);) 
{ 
    std::istringstream iss(line); 
    if (iss >> year >> std::ws && iss.get() == EOF) { done = true; break; } 
    std::cerr << "Failed to parse input '" << line << "', please try again.\n"; 
} 

if (!done) { std::cerr << "Premature end of input.\n"; } 
else  { std::cout << "Input: " << year << "\n"; } 
+0

[Demo] (https: // ideone .com/Dv8tUR) –

+3

Du machst meinen Tag. Schließlich macht jemand die richtige Eingabe auf cin;). Und ich bin auch traurig für bffaf01, da er vermutlich nichts von deinem Code verstehen wird. – Logman

+0

@Logman was ist los mit dem typischen Ansatz 'istream: clear() 'und' istream: ignore() 'ohne einen zusätzlichen Stream? – ebyrob

1

Das ist mein Ansatz:

int main() { 
    int year; 

    while (true) { 
     cout << "Enter a valid year: "; 
     cin >> year; 
     if (cin.fail()) { 
      cin.clear(); cin.ignore(); 
      cout << "Re-enter a valid value! " << endl; 
     } else break; 
    } 
    return 0; 
} 
+0

Ich erinnere mich an etwas über 'if (cin)' oder 'if (! Cin)' irgendwie besser als 'ios :: good() ',' ios :: bad() 'und' ios :: fail () 'aber es könnte' cin.fail() ==! cin' in allen Fällen sein und ich vergesse das einfach die ganze Zeit. – ebyrob

+0

Dies scheint [explodieren] (https://ideone.com/O6Hg32) online ... –

+0

@KerrekSB https://ideone.com/PwwBc3 –

0

Das Problem, das Sie beschrieben haben hier:

while (cin.fail()) 
{ 
    cout << "Re-enter a valid value! "; 
} 

Es sieht aus wie Sie nicht vollständig Versteh, was hier passiert, also werde ich das für dich abbrechen.

Der Code übersetzt etwa so:

„Während cin.fail() wahr ist, Ausgang“ einen gültigen Wert erneut eingeben! "zur Konsole"

Was es tun wird kontinuierlich, weil es keine Möglichkeit gibt, aus der Schleife auszubrechen.

Ich glaube nicht, dass cin.fail() das ist, was Sie hier verwenden möchten, es sieht so aus, als ob Sie wollen, dass ein Algorithmus Ihnen sagt, ob das Datum gültig ist oder nicht und die Abfrage zu wiederholen ist an den Benutzer, damit sie gute Daten eingeben können. Konzeptionell ist dies eine gute Übung, Sie sind auf dem richtigen Weg, aber Sie müssen ein bisschen mehr lernen.

Ich würde vorschlagen, einige Tutorials auf Eingabe/Ausgabe zu lesen und auch in Eingabe-Validierung. Dies ist eine hervorragende Ressource C++ http://www.cplusplus.com/doc/tutorial/

Und hier einige Informationen über Eingabevalidierung http://www.cplusplus.com/forum/beginner/121194/

+0

Eingabevalidierung ist nur die halbe Geschichte. Wenn Sie formatierte Eingaben direkt von 'cin' versuchen, müssen Sie auch den Fehlerstatus des Stream-Objekts zurücksetzen. –