Probleme mit getline() - GELÖST -
-
Weils mir nur gerade so auffällt: C++ Strings haben die wunderbare Eigenschaft, dass Operatoren überladen wurden. Du kannst also statt .assign() ein = verwenden und statt .append() das +=.

-
Jetzt helft doch dem armen Jungen Mal!
#include <limits> cin.ignore(std::numeric_limits<streamsize>::max(),'\n');Das ignore entfernt das '\n' aus dem Buffer. Führe es vor getline einfach aus.
-
Jupp, nun funktioniert es.
Wenn ich das richtig verstehe, sollte man also jedesmal, bevor man getline() benutzt, den Eingabepuffer löschen (oder nach Inhalt abfragen?)?
-
redrew99 schrieb:
Jupp, nun funktioniert es.
Wenn ich das richtig verstehe, sollte man also jedesmal, bevor man getline() benutzt, den Eingabepuffer löschen (oder nach Inhalt abfragen?)?Eingabepuffer löschen geht leider nicht. fflush(stdin); und alles was den gleichen Effekt hätte ist böse!

http://www.c-plusplus.net/forum/39349Deswegen muss man sich mit diesem Konstrukt da ein "ignoriere den Rest der Zeile" schaffen. Das jedes Mal vor getline() zu machen, hat aber einen entscheidenen Nachteil: Ist nichts im Eingabepuffer, muss man erst einmal "Enter" drücken.
Es gibt leider kaum wirklich schöne Lösungen dafür, bzw. ich kenne keine, das Einzige was mir dazu einfallen würde ist es, immer nach cin >> x den Rest der Zeile zu ignorieren.
-
Hm, ok.
Habe gerademal den Originalcode, der zugrundelag, kompiliert, da taucht das Problem interessanterweise nicht auf. Wie kann das sein?#include <iostream> #include <string> using namespace std; int main(void) { string str1("String Nr. 1"); // Einfache Zuweisung ist möglich string str2 = str1; string str3; // Ausgabe über cout cout << "str1: " << str1 << endl; cout << "str2: " << str2 << endl; // Komplette Zeile einlesen cout << "String eingeben: "; getline(cin, str3); // Zeile einlesen cout << "Ihre Eingabe: " << str3 << endl; // String str1 mit str3 ersetzen str1.assign(str3); cout << "str1: "<< str1 << endl; // Anzahl der Zeichen im String ausgeben cout << "Zeichen in str1: " << str1.size() << endl; // String aneinanderhängen str1.append(str2); cout << "str1: "<< str1 << endl; return 0; }
-
redrew99 schrieb:
Hm, ok.
Habe gerademal den Originalcode, der zugrundelag, kompiliert, da taucht das Problem interessanterweise nicht auf. Wie kann das sein?In dem Code ist das getline() die erste Aktion, die du auf cin ausführst, also gibt es keine vorherigen Lesevorgänge, die ein überschüssiges '\n' im Eingabepuffer zurücklassen könnten.
-
Das heisst dann also, daß jedes "Enter"(Zeilenumbruch) bei einer Eingabe über cin ein "\n" im Pufferspeicher läßt?
-
Das heißt vor allem, daß der Eingabe-Operator bis zum nächsten Whitespace (Leerzeichen, Zeilenwechsel, Tab) liest. Und der Tastaturpuffer der Konsole gibt die Eingabe üblicherweise erst an dein Programm weiter, wenn du sie mit ENTER bestätigst - dieses bleibt bei der Eingabe per operator>> im Stream zurück.
-
CStoll schrieb:
...wenn du sie mit ENTER bestätigst - dieses bleibt bei der Eingabe per operator**>>** im Stream zurück.
Ok, danke für die Erklärung.
Was ist denn davon zu halten, alle Zeilen mit "cin" durch getline() zu ersetzen?Der einzige Nachteil dürfte darin bestehen, daß man die Eingaben mit Enter abschließen muss.
-
Nachteil/Vorteil ist so eine Sache. Aber der Unterschied ist: Du kannst mehrere Wörter auf einmal eingeben. Zudem müsstest du, falls du etwas anderes als einen String einlesen möchtest, auch wieder über Umwege konvertieren.