Leere Eingabe bei cin abfangen/auswerten
-
Ich arbeite mich gerade durch das Buch "Einführung in die Programmierung mit C++" von Herrn
Stroustrup. In Kapitel 4 gibt es eine Aufgabenstellung die einen auffordert einen Wert mit Längeneinheit
einzulesen und ggf. falsche Eingaben abzufangen. Die Eingabe soll in der Form: 13.7ft oder 6m erfolgen.
Eingelesen wird mittels cin in ein double und einen string. Das ist erstmal kein Hexenwerk. Bei der Eingabe
sollen aber falsche Einheiten und fehlende Einheiten abgefangen werden - letzteres stellt mich vor ein Problem.
Ich weiss nicht, wie ich eine leere Eingabe bei cin abfangen und auswerten kann
Kann mir diesbezüglich jemand einen Tip geben ?
-
...
-
Ich weiss nicht, wie ich eine leere Eingabe bei cin abfangen und auswerten kann
Gar nicht, sowas gibt es nicht. Du kannst nur falsche, bzw. syntaktisch falsche Einheiten abfangen, indem du einfach den eingelesenen String mit anderen, vorgegebenen vergleichst.
Obwohl, warte das geht doch - Du könntest erst eine Zeile in einen String lesen und diesen in einen Stringstream packen, dann wertest du nämlich tatsächlich nur aus, was in der ersten vom Benutzer eingegebenen Zeile steht. Bei Swordfishs jetzigen Variante kann man die Einheit bspw. in einer zweiten Zeile eingeben, nachdem man einen Zeilenumbruch erzeugt hat.
@Swordfish: Magst du das
ignore(...)
bitte in jedem Schleifendurchlauf aufrufen, gell?
-
...
-
Hallo Swordfish,
hallo Sone,danke Euch für die schnellen Antworten. Ich habe es bisher ähnlich wie Swordfish gelöst allerdings
ohne die interessante Fehlerbehandlung. Nur kann auch diese Lösung nicht auf eine leere Eingabe
reagieren und z.B. den Benutzer auffordern "Sie müssen eine Einheit angeben". Ich hatte bei meinen
Recherchen auch eine Lösung mit getline() gefunden allerdings übersteigt das strenggenommen meinen
jetzigen Kenntnisstand und kommt daher als Lösung nicht in Frage. Wie es aussieht, ist die Aufgabe
im Buch nicht korrekt formuliert, da so nicht lösbar.
Ich findes es schon sehr überraschend, dass cin einen simplen Zeilenumbruch nicht abfangen kann.
Einstweilen euch nochmals vielen Dank für die Hinweise - wünsche ein schönes Wochenende.
-
Ich findes es schon sehr überraschend, dass cin einen simplen Zeilenumbruch nicht abfangen kann.
Was soll das heißen? cin ist sozusagen vorprogrammiert, dass einige Zeichen Whitespaces sind, und einige nicht. Whitespaces sind für das formatierte Einlesen essenziell.
Daher gelten auch spezielle Regeln beim formatierten Lesen (wie dem mitoperator>>
). cin soll keinen Zeilenumbruch abfangen - sondern ihn meistens ignorieren.
Siehe unten für ein Beispiel das deinen Wünschen entspricht.Edit: Ein neuer Rekord - 11 Edits.
-
So liest du immer genau eine Zeile und parst daraus:
#include <iostream> #include <sstream> int main() { double value; std::string unit; for( std::string line; std::getline( std::cin, line ); ) if( std::istringstream(line) >> value >> unit ) std::cout << "Value:\t" << value << "\nUnit:\t" << unit << "\n\n"; else std::cerr << "Input Error!\n\n"; }