• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

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

Kenobi van Gin

Brillenschlange

Registriert
14 Juli 2013
Beiträge
3.620
Ort
.\
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:

[src=cpp]string strTmp = "";
stringstream sstream;
short shrSourceFormat = 0;

while (shrSourceFormat < 1 || shrSourceFormat > 3)
{
sstream.clear();
cout << endl << " --- Binary Multi Converter ---" << endl << endl <<
" 1: Binary" << endl <<
" 2: Decimal" << endl <<
" 3: Hexadecimal" << endl <<
" Select source format: ";
getline(cin, strTmp);
sstream << strTmp;
if (sstream >> shrSourceFormat && shrSourceFormat >= 1 && shrSourceFormat <= 3)
{
break;
}
cout << " Invalid input!" << endl;
}[/src]

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 :unknown:

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:

[src=cpp]getline(cin, strTmp);

sstream.clear();
sstream << strTmp;
sstream >> shrSourceFormat;

// cout << " Invalid input!" << endl;
cout << "sstream.good(): \'" << sstream.good() << "\'" << endl <<
"strTmp: \'" << strTmp << "\'" << endl <<
"shrSourceFormat: \'" << shrSourceFormat << "\'" << endl;[/src]

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? :unknown:
 
Zuletzt bearbeitet:
Oben