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?


Anmelden zum Antworten