Korrekte Verwendung von cin.fail()

Lesezeit: 3 Minuten

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).

    – 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

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:

bool isNumeric;
std::string stringValue;
double numericValue;
if ( std::cin >> numericValue ) {
    isNumeric = true;
} else {
    isNumeric = false;
    std::cin.clear();
    if ( !(std::cin >> stringValue) ) {
        //  Shouldn't get here.
    }
}

  • Okay, ich wusste nie, dass das möglich ist. Danke!

    Benutzer2630617

    29. Juli 2013 um 16:25 Uhr

Benutzer-Avatar
Shumail

cin.fail() gibt true zurück, wenn der letzte cin-Befehl fehlgeschlagen ist, andernfalls false.

Ein Beispiel:

int main() {
  int i, j = 0;

  while (1) {
    i++;
    cin >> j;
    if (cin.fail()) return 0;
    cout << "Integer " << i << ": " << j << endl;  
  }
}

Angenommen, Sie haben eine Textdatei – input.txt und deren Inhalt ist:

  30 40 50 60 70 -100 Fred 99 88 77 66

Wenn Sie das obige Kurzprogramm darauf ausführen, wird es wie folgt aussehen:

  Integer 1: 30
  Integer 2: 40
  Integer 3: 50
  Integer 4: 60
  Integer 5: 70
  Integer 6: -100

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

1013120cookie-checkKorrekte Verwendung von cin.fail()

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

Privacy policy