Probleme mit getline(cin, ...)
-
Hiho,
Problem 1: Die Namenseingabe wird übersprungen und es wird angezeigt, der string seie 0 Zeichen lang !
Problem 2: Bei dem Einlesen der Beiden Strings wird nur der erste eingelesen, der zweite wird nicht abgefragt, entspricht dem ersten und das ganze wird dann mit * ausgegeben...
Also z.B.Bla da steht wieder das gleiche * Bla da steht wieder das gleiche
Ich versteh nicht so recht, worans scheitert
#include <iostream> #include <cmath> #include <cstdlib> #include <string> using namespace std; int main() { int seed, zu1, zu2, zu3; double x, y, z; x = pow(54, 2); y = pow(64.0, 2.0); z = pow(74, y); float v = pow(23, 23); cout << "sin von 3: " << sin(3) << endl << "cos von 3: " << cos(3) << endl << "tan von 3: " << tan(3) << endl << "atan von 3: " << atan(3) << endl << "pow von 3: " << pow(3,2) << endl << "log von 3: " << log(3) << endl << "log10 von 3: " << log10(3) << endl << "pow(54, 2), in x gespeichert: " << x << endl << "pow(64, 2), in y gespeichert: " << y << endl << "pow(74, y), in z gespeichert: " << z << endl << "Variable v(pow(23, 23)): " << v << endl << "Geben Sie einen Keim ein: "; cin >> seed; srand(seed); zu1 = rand(); zu2 = rand(); zu3 = rand(); cout << "3 Zufallszahlen mit rand(): " << endl << zu1 << endl << zu2 << endl << zu3 << endl << endl; string prompt ("Geben Sie Ihren Namen ein: "), name, linie (40, '-'), hallo ("Hallo "), gesamt; [red]cout << prompt << endl; getline(cin, name); gesamt = hallo + name;[/red] cout << linie << endl << gesamt << endl << "Ihr Name ist " << name.length() << " Zeichen lang" << endl << linie << endl; cout << "Aufgabe 1" << endl; // Aufgabe 1 double wu1, wu2, wu3, wu4; wu1 = sqrt(4); wu2 = sqrt(12.25); wu3 = sqrt(0.0121); cout << linie << endl << "ZAHL\t\t\tWURZEL\n" << endl << "4\t\t\t" << wu1 << endl << "12.25\t\t\t" << wu2 << endl << "0.0121\t\t\t" << wu3 << endl << "Wurzel ziehen aus: "; cin >> wu4; cout << endl << "Wurzel: " << "\t\t" << sqrt(wu4) << endl; // Aufgabe 2 cout << linie << endl; cout << "Aufgabe 2" << endl; string meldung("\n Aus Fehlern wird man klung"); cout << meldung << endl; int len = meldung.length(); cout << "Die Groesse des Strings: " << len << endl; int a, b; a = 12.5; srand(a); b = rand(); cout << "\nZufallszahl: " << b << endl; //Aufgabe 3 cout << linie << endl << "Aufgabe 3" << endl; string kette("Schon wieder was dazugelernt!"), zeile1, zeile2, zusammen; cout << "Ziechlaenge von string kette " << kette.length() << endl; [red]cout << "Zeile 1 eingeben: "; getline(cin, zeile1); cout << "Zeile 2 eingeben: "; getline(cin, zeile2); zusammen = zeile1 + " * " + zeile2; cout << zusammen << endl;[/red] cout << linie << endl; return 0; }
Danke und Tschö
-
scheib mal vor die getlines dieses:
std::cin.clear (); std::cin.ignore ( std::cin.rdbuf () -> in_avail () );
bei cin bleibt etwas im buffer, das wird dadurch rausgeholt.
ps: bzw ohne std, weil du den namespace ja schon dabei hast[ Dieser Beitrag wurde am 30.04.2003 um 00:33 Uhr von elise editiert. ]
-
Funktioniert aber auch nicht bei allen Compilern; der GCC checkt das bei mir z.B. nicht...
Quick and Dirty Hack:while(cin.peek() == '\n') cin.ignore();
Ist zwar schei*e, funktioniert aber, solange du nicht erwartest, das jemand eine Leerzeile eingibt...
-
der GCC checkt das bei mir z.B. nicht...
Bei vielen gcc-Versionen hilft ein simples:
cin.sync();
-
das sind so die gründe, die einem die lust an i/o vermiesen. bzw. benutze ich immer getline und keinen operator>>(istream&,...).
cin.ignore(cin.rdbuf()->in_avail());
ist schon häßlich genug, da trägt sync auch nichmehr zur schönheit bei
oder anders ausgedrückt: es ist schwachsinn, weniger als eine zeile zu lesen, wenn die i/o sowieso zeilenbasiert ist.
um konstruktiv zu sein:
gibt es da nicht eine methode istream::skipws(), die hier ihren dienst tun sollte?