Ergebnis 1 bis 1 von 1

Thema: C++ - Nutzereingaben validieren - Problem mit getline(), cin und stringstream

  1. #1
    Brillenschlange Avatar von Kenobi van Gin
    Registriert seit
    Jul 2013
    Ort
    .\
    Beiträge
    2.529
    ngb:news Artikel
    1

    C++ - Nutzereingaben validieren - Problem mit getline(), cin und stringstream

    Hallo zusammen.

    Ich beschäftige mich, wie an anderer Stelle schonmal erwähnt, gerade wieder mit C++ und stehe jetzt vor einem Problem. Ich schreibe ein Konsolenprogramm, das auf Wunsch zwischen Binär-, Dezimal- und Hexadezimalzahlen hin- und herkonvertieren soll.
    Die Klasse, die das eigentliche Konvertieren übernimmt, ist noch nicht vollständig, funktioniert aber soweit.

    Probleme habe ich nun allerdings dabei, den Nutzer das Quell- und das Zielformat wählen zu lassen, bzw. die entsprechenden Eingaben zu validieren:

    Spoiler: 

    Code (C++):
    1. string strTmp = "";
    2.     stringstream sstream;
    3.     short shrSourceFormat = 0;
    4.  
    5.     while (shrSourceFormat < 1 || shrSourceFormat > 3)
    6.     {
    7.         sstream.clear();
    8.         cout << endl << "  --- Binary Multi Converter ---" << endl << endl <<
    9.                     "       1: Binary" << endl <<
    10.                     "       2: Decimal" << endl <<
    11.                     "       3: Hexadecimal" << endl <<
    12.                     "       Select source format: ";
    13.         getline(cin, strTmp);
    14.         sstream << strTmp;
    15.         if (sstream >> shrSourceFormat && shrSourceFormat >= 1 && shrSourceFormat <= 3)
    16.         {
    17.             break;
    18.         }
    19.         cout << "       Invalid input!" << endl;
    20.     }


    Gebe ich an der entsprechenden Stelle nun einen gültigen int-Wert ein, funktioniert die Abfrage. Bei Werten zwischen 1 und 3 läuft das Programm also weiter, bei höheren oder niedrigeren Werten bekomme ich die Ausgabe "Invalid input!" und muss die Eingabe erneut tätigen. Gebe ich dann beim nächsten Versuch einen Wert innerhalb des Bereiches ein, läuft das Programm wiederum normal weiter.

    Gebe ich aber eine völlig andere Zeichenfolge ein, z.B. einen Buchstaben, ein Wort, eine float-Zahl, stecke ich in der Endlosschleife "Invalid input" und komme auch nicht mehr hinaus, wenn ich dann einen validen Wert eingebe.
    Leider finde ich grade die Quelle nicht mehr, aus der ich diese Umsetzung für die Validierung der Nutzereingabe habe. Mir kommt es so vor, als würde dort etwas im cin-Puffer verbleiben, wenn die Konvertierung fehlschlägt. Ich hätte aber eigentlich erwartet, dass ein neues getline(cin, strTmp) eventuell verbliebene Daten im Puffer überschreiben würde

    Habe ich einen Denkfehler?

    --- [2018-09-07 16:59 CEST] Automatisch zusammengeführter Beitrag ---

    Ich habe noch ein bisschen weiter rumprobiert und statt der Variante if (sstream >> shrSourceFormat [...]) mal getestet, was bei:

    Code (C++):
    1. getline(cin, strTmp);
    2.  
    3.         sstream.clear();
    4.         sstream << strTmp;
    5.         sstream >> shrSourceFormat;
    6.  
    7.         // cout << "       Invalid input!" << endl;
    8.         cout << "sstream.good(): \'" << sstream.good() << "\'" << endl <<
    9.                 "strTmp: \'" << strTmp << "\'" << endl <<
    10.                 "shrSourceFormat: \'" << shrSourceFormat << "\'" << endl;
    passiert. Tatsächlich bekomme ich als Ergebnis von sstream.good() immer 0 angezeigt, egal ob ich vorher eine valide Eingabe (also einen int-Wert) extrahiert habe, oder ob es z.B. ein String war.
    Sollte sstream.good() nicht eigentlich 0 sein, wenn alles gut gegangen ist, und 1, wenn bei der Extraktion etwas schief gegangen ist?
    Geändert von Kenobi van Gin (07.09.18 um 17:00 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •