Problem mit der cin.getline() in C++
Also wenn ich einen Name (Vor-und Nachnamen) mit dem cin.getline(vollername, 256) Befehl probiere ein zu lesen dann kommt in der Eingabeaufforderung am Ende "Bitte vollen Namen eingeben: Das ist also dein voller Name ohne das das man was eingeben kann. Hatte mich mal umgehört und da hieß es immer weil ich davor schon mal eine Eingabe über cin>> Stream gemacht habe auch von dem typen char dann denkt der Compiler das er die Variable schon eingelesen hat und deswegen überspringt er diesen cin.getline() Befehl einfach. Kann mir jemand sagen ob das stimmt also die Erklärung und am besten auch gleich sagen wie ich dieses Problem beheben kann.
5 Antworten
Wo genau dein Fehler ist, kann man hier nicht erkennen. Dazu bräuchte man Codeausschnitte.
Dein Problem ist doch, dass du zwei mal eine Eingabe erwartest, aber nur beim ersten Mal auch tatsächlich eine Eingabe bei der Konsole tätigen musst.? Nur damit ich das richtig verstanden habe.
Wenn du cin.getline() verwenden möchtest, dann darfst du vorher nicht "cin.operator >>()" verwenden. Denn der Operator lässt z.B. das Zeilenumbruch-Zeichen im Buffer drin. Und "getline" liest jedoch nur bis zum nächsten Zeilenumbruch.
Sofern ich es richtig verstanden habe, geht es nicht um einen Fehler, sondern mehr oder weniger um eine generelle Frage zu C++.
Versuch mal bevor du zur eingabe aufforderst den puffer zu leeren mit cin.synch (). und cin.clear ().
Verwende auch statt cin.getline ().
getline (cin, <stringname>) evtl funktionierts damit
Ja das kann vorkommen das die variable die vorher eingelesem wurde den fehler verursacht WENN man den puffer nicht entleert.
Um dir diese Frage zu beantworten, muss ich zuerst etwas zu den Grundlagen von C++ erklären:
dann denkt der Compiler
Der Compiler hat damit rein gar nichts zu tun, sondern die Laufzeitbibliothek. Der Compiler kennt "cin" gar nicht, sondern sehr stark vereinfacht gesagt ist "cin" in den Dateien "iostream" und "libstdc++.a" (bei GNU C++, bei Microsoft ist es eine andere Datei) definiert.
Durch das Austauschen der beiden Dateien könnte man "cin" umdefinieren, so dass es etwas komplett anderes macht - zum Beispiel Sound-Ausgabe:
cin << "c:\\music\\myFile.mp3";
davor schon mal eine Eingabe über cin>> Stream gemacht habe
Was genau passiert, hängt nicht nur davon ab, was in den beiden oben genannten Dateien definiert ist, sondern auch davon, was das Betriebssystem macht. Unter Linux kann man die Konsole zum Beispiel in zwei Modi versetzen:
- "Normaler" Modus: Man muss eine ganze Zeile eingeben, bis ein Programm die Eingabe mitbekommt. Ein "cin>>" würde also warten, bis du die Eingabetaste gedrückt hast. Wenn du die "Zurück"-Taste drückst, um das letzte eingegebene Zeichen zu löschen, kümmert sich das Betriebssystem darum.
- "Direkter" Modus: Eine gedrückte Taste wird sofort an das Programm weitergegeben. Das heißt, dass ein "cin>>char" sofort fertig ist, nachdem man eine Taste gedrückt hat, ohne dass man die Eingabetaste drücken muss. Die "Zurück"-Taste müsste in diesem Fall allerdings vom Programm beachtet werden, da das Betriebssystem diese Taste wie eine ganz normale Taste behandelt.
In beiden Fällen würde die Eingabetaste bei einem "cin>>char" wie eine andere Taste eingelesen werden. Die Methode "cin.getline()" hingegen liest so lange Zeichen ein, bis "cin>>char" die Eingabetaste zurückliefert.
Wenn nun dein Beispielprogramm so aussieht:
char a, b, c[100];
cout << "A: ";
cin >> a;
cout << "B: ";
cin >> b;
cout << "C: ";
cin.getline(c,100);
Könntest du Folgendes eigeben:
A: X
B:
C: Y
Nachdem du "X" eingetippt hast, hast du die Eingabetaste gedrückt. Daher hat das zweite "cin" die Eingabetaste in die Variable "b" geschrieben. Das "getline" hat dann "Y" nach "c" geschrieben.
Das Programm würde nach der Ausgabe von "B:" nicht auf eine Eingabe warten, da du die zweite Taste - nämlich die Eingabetaste - ja schon nach "A:" gedrückt hast.
Es wäre aber auch folgende Eingbe möglich:
A: XYHallo
B:
C:
Du hast die Eingabetaste also erst nach dem "Hallo" getippt. Dann würde das erste "cin" die Taste "X" einlesen und das zweite "cin" die Taste "Y" (in Variable "b"). Das "getline" würde "Hallo" einlesen (in Variable "c").
Das Programm würde nach den Ausgaben "B:" und "C:" nicht auf weitere Eingaben warten, da du ja bereits bei "A:" genügend Tasten gedrückt hast.
Versuch mal probehalber direkt vor dieFehlerhaften Eingabe die Befehle
cin.sync(); cin.clear();
zu setzen.
Geh auf die Seite stackoverflow, da findest du alles bezüglich programmierung