Einlesen eines Strings mit Leerzeichen macht Probleme
-
Hallo,
ich habe ein kleines Problem. Ich versuche verschiedene Zahlen und Zeichen einzulesen, doch ab einer Stelle, da läuft das Programm einfach runter, ohne auf Eingaben zu warten:char zeichen; string wort; float fzahlhex, fzahlokt; cout << "Geben Sie ein Zeichen ein: "; cin >> zeichen; cout << "Geben Sie ein Wort ein: "; getline(cin,wort) >> wort; //Wenn das Wort Leerzeichen hat, dann werden einfach die nächsten beiden Ausgaben gemacht, aber ich kann keine Eingabe mehr machen. cout << "Geben Sie eine Oktalzahl ein: "; cin >> oct >> fzahlokt; cout << "Geben Sie eine Hexadezimalzahl ein "; cin >> hex >> fzahlhex;Das passiert nur wenn Leerzeichen vorhanden sind. Aber getline() ist doch gerade dafür da.

Mister Getline()
-
Nimm
getline(cin,wort)
-
Ups, was ein Fehler. Aber das Programm läuft immer noch weiter. Nachdem ich das Zeichen eingegen habe, wird "Bitte geben Sie ein Wort ein" und danach sofort "Bitte geben Sie eine Oktalzahl ein" ausgegeben.
Warum? Ich will doch mein Wort eingeben.
Mister Getline()
-
Ahh, da wird anscheinend durch das cin >> char zwar ein Zeichen gelesen, das newline Zeichen, mit der man die Eingabe abschließt, scheint aber im stream zu bleiben (wusste ich bis jetzt auch nicht, dass das so ist). Dagegen hilft es, das folgende newline Zeichen zu ignorieren:
char zeichen; string wort; float fzahlhex, fzahlokt; cout << "Geben Sie ein Zeichen ein: "; cin >> zeichen; cin.ignore(1,'\n'); cout << "Geben Sie ein Wort ein: "; getline(cin,wort); cout << "Geben Sie eine Oktalzahl ein: "; cin >> oct >> fzahlokt; cout << "Geben Sie eine Hexadezimalzahl ein "; cin >> hex >> fzahlhex;edit: Noch eine Anmerkung: hex und oct wirken nur auf Integertypen, Gleitkommazahlen werden immer als base10 behandelt. Willst du Gleitkommazahlen in anderen Basen verwenden, musst du das wohl selbst implementieren.
-
Hallo,
dazu habe ich auch mal eine Frage:Wenn ich einfach ein Zeichen eingebe, warum bleibt dann das newline Zeichen im stream stecken? Da ist doch gar keins??ß
Vielen Dank
lg, freakC++
-
@freakC++: Ob du wohl die Enter-Taste drückst

-
-
SeppJ schrieb:
Ahh, da wird anscheinend durch das cin >> char zwar ein Zeichen gelesen, das newline Zeichen, mit der man die Eingabe abschließt, scheint aber im stream zu bleiben (wusste ich bis jetzt auch nicht, dass das so ist). Dagegen hilft es, das folgende newline Zeichen zu ignorieren:
char zeichen; string wort; float fzahlhex, fzahlokt; cout << "Geben Sie ein Zeichen ein: "; cin >> zeichen; cin.ignore(1,'\n'); cout << "Geben Sie ein Wort ein: "; getline(cin,wort); cout << "Geben Sie eine Oktalzahl ein: "; cin >> oct >> fzahlokt; cout << "Geben Sie eine Hexadezimalzahl ein "; cin >> hex >> fzahlhex;edit: Noch eine Anmerkung: hex und oct wirken nur auf Integertypen, Gleitkommazahlen werden immer als base10 behandelt. Willst du Gleitkommazahlen in anderen Basen verwenden, musst du das wohl selbst implementieren.
Das funzt bei mir nicht richtig. So gehts aber:
void clb() // Clear buffer :) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } int main( ) { char zeichen; string wort; float fzahlhex, fzahlokt; cout << "Geben Sie ein Zeichen ein: "; cin >> zeichen; clb(); cout << "Geben Sie ein Wort ein: "; clb(); cout << "Geben Sie eine Oktalzahl ein: "; cin >> oct >> fzahlokt; clb(); cout << "Geben Sie eine Hexadezimalzahl ein "; cin >> hex >> fzahlhex; return 0; }