Problem mit der cin.getline() in C++

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.


martin7812  30.05.2015, 07:41

Sofern ich es richtig verstanden habe, geht es nicht um einen Fehler, sondern mehr oder weniger um eine generelle Frage zu C++.

0

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