cin und getline
-
auf die gefahr hin, dass ich hier "erschlagen" werde mal ne ganz billige frage:
als eigentlicher java- und delphi-programmierer bin ich gerade dabei, mir c++ mithilfe eines schlauen buches beizubringen. als übrung hab ich mal paar zeilen geschrieben, wo zuerst int und double-werte eingegeben werden können, bis der int-wert 0 ist. danach soll miut getline eine zeile eingelesen werden(vor- und nachname). das getline scheint er aber zu überspringen. Er gibt einfach nur aus:
Bitte Vor- und Nachname eingeben:
ProgrammendeHier der Code:
//int und double cout << endl << "int und double:" << endl; double d; while ((cin >> i >> d) && (i != 0)) cout << i << endl << d << endl; //ganze zeile als string lesen string name; cout << "Bitte Vor- und Nachname eingeben: "; getline(cin, name); cout << name; cout << "Programmende" << endl; cin >> i;Der scheint vielleicht noch sowas wie nen leeren string im cin-puffer zu haben und liest nichts neues mehr ein.
wenn ich nur diesen teil
//ganze zeile als string lesen string name; cout << "Bitte Vor- und Nachname eingeben: "; getline(cin, name); cout << name;in nem neuen Programm eingebe, dann geht das. Warum?
-
Schreib mal ein
cin.get();vor das getline!
PS:
Also ich persönlich finde folgende Zeilen hässlich:while ((cin >> i >> d) && (i != 0)) cout << i << endl << d << endl;Besser finde ich persönlich:
do { cout<<" Bla bla bla !"; cin>>i; cout<<" Bla bla bla !"; cin>>d; } while(i!=0);
-
In Deiner Version hast Du eine Endlosschleife falls es bei cin zum fehler kam @|M|
-
Okey, dann halt:
i=0; do { cout<<" Bla bla bla !"; cin>>i; cout<<" Bla bla bla !"; cin>>d; } while(i!=0);
-
Immer noch nicht besser. Du wirst nicht drumherum kommen, den Status von cin mit in die Schleifensteuerung einzubeziehen.
-
da scheint noch ein '\n' im eingabepuffer zu stecken deshalb solltest du folgendes machen
while (cin.get()!='\n');so kannst du das '\n' wieder rausziehen oder alternativ (aber nicht zu empfehlen):
fflush(stdin);
-
Das mit der while--schleife ist geschickter, da bei vorheriger eingabe von "tab" und enter, das getline auch wieder übersprungen wird. hab das gerade getestet. warum sollte man das "flush" nicht verwenden?
-
stevewilson schrieb:
warum sollte man das "flush" nicht verwenden?
weils kein standard ist und somit nicht portierbar (z.b. linux kann damit glaub' ich nix anfangen).
-
besser und portierbar ist
while(getchar()!='\n');
man kann sich ja ein makro schreiben
#CLEAR() while(getchar()!='\n');
und dann immer mit CLEAR() den stream leeren.
-
Warum wollt ihr unbedingt etwas eigenes über getchar() basteln? Für das Problem liefert cin doch die korrekte Lösung: ignore().