# [C++] Nerviges Prob mit cin und cin.getline()



## Sinac (8. August 2003)

Ahoi...
Habe son total bescheuertes Problem mit cin.getline()
Also da ich mit cin >> ja nur ein Wort zur Zeit einlesen
kann, wollte ich einfach cin.getline nehmen, wenn ich also

```
int main(){
	char Eins[256], Zwei[256];
      cout << "Satz Eins: ";
	cin.getline (Eins,256);
	cout << "Satz Zwei: ";
	cin.getline (Zwei,256);
	cout << Eins << Zwei << endl;
```
Nehme, ist alles kein Ding.

Wenn cih aber cin vorher schonmal benutze

```
int main(){
	char Eins[256], Zwei[256];
      int zahl;
      cout << "Zahl:";
      cin >> Zahl;
      cout << "Satz Eins: ";
	cin.getline (Eins,256);
	cout << "Satz Zwei: ";
	cin.getline (Zwei,256);
	cout << Eins << Zwei << Zahl << endl;
```
Probiere, wird die 2. Eingabe, also von Eins übersprungen 
und es kommt gleich Zwei...

Hab schon alles probiert und gegooglet bis zum k*tzen!!!

Greetz...
Sinac


----------



## bitmaster (8. August 2003)

Das gleiche Problem hatte ich auch mal.
Nimm davor einfach fflush() oder cin.flush() her.
Dass müsste dann so aussehen:


```
int main(){
	char Eins[256], Zwei[256];
      cout << "Satz Eins: ";fflush();
	cin.getline (Eins,256);fflush();
	cout << "Satz Zwei: ";fflush();
	cin.getline (Zwei,256);fflush();
	cout << Eins << Zwei << endl;
}
```

Probers mal damit. Wenn nicht *****, dann checks wie oben mit cin.flush() aus. Mehr kann ich dir leider auch nicht sagen.


----------



## Sinac (8. August 2003)

ok, werd ich Montag gleich mal probieren!
*** erstma!
Hat vielleicht auch jemand ne Erklärung warum das so ist?
Ist imma blöd wenn man was löst aber im Prinzip nix dabei
gelernt hat!

Greetz & a nice, fuckin' Weekend!
.:Sinac:.


----------



## bitmaster (9. August 2003)

Ich kanns dir auch erklären:

cin und cin.getline arbeiten mit Inputstreams und weil du ja da schon was eingegeben hast, denkt C++ dass das nächste cin (oder auch cin.getline) schon die Eingabe hat, also überspringt er ihn einfach.
Denk ich mal


----------



## Sinac (9. August 2003)

Hmm, ist mir irgendwie unklar, aber egal, ich probiers mal!
***


----------



## Tobias K. (10. August 2003)

moin


"cin" liesst bis zu einem Leerzeichen oder einem "\n".
"cin.getline" liesst bis zu einem "\n".

Wenn man also eine Eingabe per "cin" macht z.B. "Hallo du" und dann per Enter bestätigt, wird Hallo per "cin" gespeichert und der Rest bleibt im Puffer. Wenn man dann "cin.getline" aufruft, wird der Puffer erstmal in "cin.getline" geschrieben und das inklusive dem Enter "\n" deshalb denkt "cin.getline" das die Eingabe beendet ist.


mfg
umbrasaxum


----------



## Sinac (10. August 2003)

Achso, klingt einleuchtend!
***


----------



## Sinac (11. August 2003)

Huhu, es klappt, allerdings mit fflush(stdin);
T H X   <- warum kommen dafür stzerne?


----------



## JPakusch (11. Juni 2005)

Hallo, bei mir führt er cin.getline nicht aus,
wird gar nicht kompiliert.
Ihm fehlt ne function oder sowat sagt der da.
Muss man für cin.getline noch ne Bibliothek mit einbinden?


----------



## Tobias K. (11. Juni 2005)

moin


Dafür musst du die iostream(.h) einbinden.
Und ohne genaue Fehlerbeschreibung welche Funktion fehlt wird dir keiner großartig helfen können.


mfg
umbrasaxum


----------



## shrewm (11. Juni 2005)

cin.sync();
vor einem getline kann je nach Situation auch manchmal helfen, funktioniert soweit ich weiss aber nur bei MSVC++


----------



## KristophS (11. Juni 2005)

cin.sync() gehört zur Standardbibliothek,.


----------



## JPakusch (12. Juni 2005)

Also gut, bei mir wird ne ganze menge als fehlermeldung ausgespuckt,wenn ich cin.getline verwende. 
mein Befehl sieht so aus: cin.getline(tmp,250);

ich tipp die Fehler hier mal rein:

no matching function for call to `std::basic_istream<char, std::char_traits<char> >::getline(std::string&, int)' 

 note C:\Dev-Cpp\include\c++\3.4.2\bits\istream.tcc:582 candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>] 

 note C:\Dev-Cpp\include\c++\3.4.2\bits\istream.tcc:582                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]


----------



## KristophS (12. Juni 2005)

Für STL-Strings ist die globale Funktion getline(istream, string) zuständig.
Benutzung:
getline(cin, string);


----------



## Tobias K. (12. Juni 2005)

moin


Irgendwas machst du falsch.
Poste mal deinen Code.


mfg
umbrasaxum


----------



## JPakusch (12. Juni 2005)

```
cout<<"Nachnamen eingeben: ";
             getline(cin,tmp);//cin>>tmp;
             adr[adr[0].get_lfd_nr()].set_nachname(tmp);
```

habs hier mal getestet mit dem getline.
Aber der liest so nix von der Tastatur ein sondern überspringts einfach.


----------



## Tobias K. (12. Juni 2005)

moin


Dann  mach mal vor dem getline.. ein

```
fflush(stdin);
```


mfg
umbrasaxum


----------



## JPakusch (13. Juni 2005)

Ja, Jetzt gehts
So wollt ichs haben
Hatte immer nur dahinter das fflush gesetzt. das hatte ich versucht.

Vielen Dank an alle!

mfg, Jan Pakusch


----------

