Was ist die richtige Art zu verwenden cin.fail();?
Ich mache ein Programm, wo Sie etwas eingeben müssen. Es ist nicht ganz klar, ob Sie eine Zahl oder ein Zeichen eingeben müssen. Wenn ein Benutzer ein Zeichen anstelle einer Zahl eingibt, spielt die Konsole verrückt. Wie kann ich verwenden cin.fail() um das zu beheben?
Oder gibt es einen besseren Weg?
@ Shumail92 Ich habe es derzeit nicht.
– Benutzer2630617
29. Juli 2013 um 16:13 Uhr
In einer solchen Situation würden Sie normalerweise ein Zeichen lesen und dann prüfen, ob es sich um eine Ziffer handelt (und wenn ja, in eine Zahl umwandeln).
@JerryCoffin Ich würde das Gegenteil tun. Dinge wie das Überspringen von Leerzeichen und das erneute Einfügen des Zeichens in den Stream richtig hinzubekommen, ist für einen Anfänger nicht offensichtlich.
– James Kanze
29. Juli 2013 um 16:23 Uhr
Übrigens, +1 für Ihre Frage
– Shumail
29. Juli 2013 um 16:38 Uhr
std::cin.fail() wird verwendet, um zu testen, ob die vorherige Eingabe erfolgreich war. Es ist jedoch idiomatischer, den Stream einfach so zu verwenden, als wäre er ein boolescher Wert:
if ( std::cin ) {
// last input succeeded, i.e. !std::cin.fail()
}
if ( !std::cin ) {
// last input failed, i.e. std::cin.fail()
}
In Kontexten, in denen die Syntax der Eingabe entweder eine Zahl oder ein Zeichen zulässt, besteht die übliche Lösung darin, sie zeilenweise (oder in einer anderen Zeichenfolgenform) zu lesen und zu analysieren. Wenn Sie feststellen, dass es eine Nummer gibt, können Sie ein verwenden std::istringstream um es zu konvertieren, oder eine beliebige Anzahl anderer Alternativen (strtoloder std::stoi wenn Sie C++11 haben).
Es ist jedoch möglich, die Daten direkt aus dem Stream zu extrahieren:
Es wird nach dem 6. Wert nicht fortgesetzt, da es nach dem Lesen des siebten Werts beendet wird Wortweil das keine ganze Zahl ist: cin.fail() kehrt zurück true.
@hetepeperfan numerisch gesehen ist 0 der einzige falsche Wert.
– Borgführer
29. Juli 2013 um 16:33 Uhr
Ja, aber es wird in dieser Situation funktionieren – ich habe die Antwort bearbeitet und hinzugefügt int main() auch.
– Shumail
29. Juli 2013 um 16:34 Uhr
Hier stimmt etwas nicht (zusätzlich zu der schlechten Formatierung). Zunächst natürlich std::istream::fail() gibt niemals “Nicht-Null” oder “Null” zurück: es kehrt zurück true oder false. Zweitens gibt es in der angegebenen Textdatei alles aus, -100 ist eine ganze Zahl, und std::cin.fail() wird zurückkehren false nachdem ich es gelesen habe.
– James Kanze
29. Juli 2013 um 17:04 Uhr
Dies schlägt beim Betreten fehl 1.2 oder 1,2
– Peon
26. September 2017 um 16:56 Uhr
@JamesKanze “Nicht-Null” und “Null” SIND in C ++ wahr bzw. falsch.
– Layne Bernardo
11. September 2021 um 1:34 Uhr
10131200cookie-checkKorrekte Verwendung von cin.fail()yes
@ Shumail92 Ich habe es derzeit nicht.
– Benutzer2630617
29. Juli 2013 um 16:13 Uhr
In einer solchen Situation würden Sie normalerweise ein Zeichen lesen und dann prüfen, ob es sich um eine Ziffer handelt (und wenn ja, in eine Zahl umwandeln).
– Jerry Sarg
29. Juli 2013 um 16:13 Uhr
Sie könnten ein gutes C++-Buch verwenden. aber schau mal: en.cppreference.com/w/cpp/io/basic_ios/fail
– hetepeperfan
29. Juli 2013 um 16:15 Uhr
@JerryCoffin Ich würde das Gegenteil tun. Dinge wie das Überspringen von Leerzeichen und das erneute Einfügen des Zeichens in den Stream richtig hinzubekommen, ist für einen Anfänger nicht offensichtlich.
– James Kanze
29. Juli 2013 um 16:23 Uhr
Übrigens, +1 für Ihre Frage
– Shumail
29. Juli 2013 um 16:38 Uhr