getline wird übersprungen
-
Hi,
folgendes Problem, immer wenn ich vor einem getline ein normales cin >> mache, wird das getline einfach übersprungen. Wie kann ich das verhindern?int zahl; cin >> zahl; cout << "Text eingeben:" << endl; string text; cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); getline(cin,text);
Gartenzwerg
-
Bei mir funktioniert es ohne Probleme
Caipi
-
Hi!
Das Problem hatte ich auch, es ist bestimmt Compilerabhängig - Ich benutze gcc 3.3.3. Anscheinend wird nach Zeile 3 der Puffer erst "geflusht", wenn noch einmal von cin gelesen wird (Bug? bestimmt). Hier ist ein kleiner Workaround (Zeile 4):
string text; int zahl; cin >> zahl; getline(cin, text); cout << "Text eingeben:" << endl; cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); getline(cin, text);
Ist vielleicht nicht sooo der dolle Codestil, zweimal getline für eine Eingabe zu benutzen, funktioniert aber dafür.
cu
-LC
-
Hi,
ich nutze auch den gcc 3.3.3.
Danke, für den Workaround, aber so wirklich befriedigent ist das leider nicht. Ist das evtl. ein bekannter bug?Gartenzwerg
-
Hallo,
ersetz einfach mal dascin.ignore(cin.rdbuf()->in_avail());
durch ein:
cin.ignore(numeric_limits<streamsize>::max(), '\n');
und das Problem sollte verschwunden sein.
-
hi,
danke schön. Funktioniert ohne Probleme, aber könntest du bitte erklären, was da genau passiert? Also er ignoriert jetzt alle Zeichen der maximalen Streamlänge oder wie?Gartenzwerg
-
Gartenzwerg schrieb:
hi,
könntest du bitte erklären, was da genau passiert? Also er ignoriert jetzt alle Zeichen der maximalen Streamlänge oder wie?Der erste Parameter gibt die Zahl der maximal zu ignorierenden Zeichen an.
Da wir nicht wissen, wieviele Zeichen noch im Puffer stehen, nehmen wir den schlimmsten Fall an und übergeben die maximal mögliche Zeichenanzahl.
streamsize ist ein signed integer Typ, der z.B. für die Spezifikation von Puffergrößen benutzt wird. numeric_limits<streamsize>::max() liefert den größten Wert den streamsize annehmen kann.Mit dem zweiten Parameter kann man einen Delimiter-Zeichen festlegen, also ein Zeichen, bei dessen auftreten das ignorieren von Zeichen spätestens beendet werden soll. Das Auftreten des Delimter-Zeichens beendet also den ignore-Prozess vorzeitig wobei das Delimiter-Zeichen selbst ebenfalls ignoriert wird.
Umgangssprachlich sagt die Anweisung also: Ignoriere solange Zeichen aus dem Eingabepuffer bis du ein '\n' oder eof findest.
-
danke sehr!