2016-09-02 4 views
1

Ich habe ein Problem mit dem folgenden Code. Ich benutze es in Xcode (OS X).Wie std :: cin zurücksetzen, wenn Sie es verwenden?

[mein erster Versuch dieser Code entfernt]

Wie Eingang Reset std :: cin? Ich versuche, andere Werte einzugeben, aber ich kann nicht, weil std :: cin nach meinem falschen Wert nicht mehr zu funktionieren scheint.

UPD2 In meinem zweiten Versuch ich diesen Code verwenden:

for (unsigned char i = 0; i < 5; i++) { 

    int value = 0; 

    std::cout << "\n>> Enter \"value\": "; 
    std::cin >> value; 

    if (std::cin.fail()) { 
     std::cin.clear(); 
     std::cin.ignore(); 
     std::cout << "Error: It's not integer value!\n"; 
    } else { 
     std::cout << "The value format is ok!\n"; 
    } 

    std::cout << "value = " << value << std::endl; 

} 

Hier habe ich gerade Eingang 5 Werte in einer Schleife. Jedes Mal, wenn ich es bei einem Fehler überprüfe. Wenn ich den falschen Wert ("asdf") setze, wird std :: cin verrückt und funktioniert nicht mehr. Ich erhalte diese Ausgabe:

>> Enter "value": 4 
The value format is ok! 
value = 4 

>> Enter "value": 234 
The value format is ok! 
value = 234 

>> Enter "value": asdfghjkl 
Error: It's not integer value! 
value = 0 

>> Enter "value": Error: It's not integer value! 
value = 0 

>> Enter "value": Error: It's not integer value! 
value = 0 
234 
234 
78 
345 
657 
345 
dsf 
f 

Antwort

4

Sie könnten verwenden, wenn die Bedingung, std::cin.fail() passiert:

std::cin.clear(); 
std::cin.ignore(); 

Und dann mit der Schleife weiter, mit einer continue; Aussage. std::cin.clear() löscht die Fehlerflags und setzt neue, und std::cin.ignore() ignoriert sie effektiv (durch Extrahieren und Verwerfen).

Quellen:

  1. cin.ignore()
  2. cin.clear()
+0

Antwort @Galik aktualisiert –

+3

'clear' der Fehlerzustand-Flags des löscht Strom. Es macht nichts mit den Charakteren. Und 'Ignorieren' ohne Argumente wird nur ein einzelnes Zeichen verwerfen, was bedeutet, dass wenn Sie' "asdf" 'eingeben, es 4 mal durchlaufen wird, und Ihnen sagt, dass Ihre Eingabe schlecht ist, bevor Sie es erneut eingeben können. Sie sollten 'std :: cin :: ignore (std :: numeric_limits :: max(), '\ n')' verwenden, um bis zum Ende der Zeile zu verwerfen. –

+0

@BenjaminLindley - Ich habe ein Problem mit "std :: cin :: ignore". Ich benutze CLang und es scheint, es sollte std :: cin.ignore aber mit nur einem Parameter sein ... – JavaRunner

Verwandte Themen