Verständnisprobleme bei simplen Ablauf
-
Hey Leute,
mein Problemchen ist eines was sicherlich hier und da einige Anfänger schonmal hatten aber ich komme schlichtweg zu keiner Lösung...Mein Code ist in sekundenschnelle überflogen und ich komme direkt zum Punkt.
#include <iostream> #include <string> int main() { int number; std::string name; std::cout << "Please enter a Number: "; std::cin >> number; if (number < 5) { std::cout << "Bitte Namen eingeben: "; std::getline(std::cin, name); } if (name != "") { std::cout << name << std::endl; } else { std::cout << "Time to say Goodbye ;)" << std::endl; } return 0; }
Im Terminal wird mir selbst bei Eingabe einer Zahl < 5 aber keine Eingabemöglichkeit für den Namen ausgegeben wie ich es eigentlich erwarten würde durch den getline Aufruf weshalb ich mich an euch wende. Ums kurz zu machen ich verstehe nicht warum ich keine Namenseingabe bekomme.
Hier noch die Terminalausgabe:
Terminalbild
-
Das liegt daran, dass
cin >> number
nur die Zahl einliest. Du gibst aber "Zahl + Enter" ein. Das "Enter"-Zeichen ist noch im Stream drin. Daher liest das folgendegetline
auch 0 Zeichen (und das Enter) ein.Das kann bei Streams sehr merkwürdig sein. Immer dran denken, dass noch Zeichen im Eingabestrom von der vorherigen Eingabe sein können.
Mit
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
kannst du alle Zeichen bis zum folgenden Enter entfernen. Führe dies vor demgetline
aus (nebst#include <limits>
).
-
Dieser Beitrag wurde gelöscht!
-
@wob recht herzlichen Dank
-
@OwnliE sagte in Verständnisprobleme bei simplen Ablauf:
@wob recht herzlichen Dank
In deiner alten Version hättest du auf die Frage nach der Zahl gleich "3 Max Mustermann<enter>" eingeben können, dann hättest du das gewünschte Verhalten gehabt. Mit dem
ignore
wird jetzt das " Max Mustermann<enter>" aus dem Stream entfernt.
-
@wob Ziel war es ja hier explizit die Zahl und danach gesondert den Namen einzugeben. So funktioniert es wie gewünscht.
-
@OwnliE sagte in Verständnisprobleme bei simplen Ablauf:
@wob Ziel war es ja hier explizit die Zahl und danach gesondert den Namen einzugeben. So funktioniert es wie gewünscht.
Schon klar. Ich wollte nur zum Verständnis beitragen:
>> int_variable
überspringt führenden Leerraum (Space, Enter, ...) und liest dann solange wie geht Ziffern aus dem Stream ein, hört am ersten Nicht-Ziffernzeichen auf (das verbleibt im Stream)getline(stream, string_var)
liest bis zum '\n'-Zeichen, das dann aus dem Stream entfernt wird, aber nicht instring_var
landet.- du kannst das Verhalten von Streams auch ändern, z.B. mit skipws.