cin und getline



  • auf die gefahr hin, dass ich hier "erschlagen" werde mal ne ganz billige frage:

    als eigentlicher java- und delphi-programmierer bin ich gerade dabei, mir c++ mithilfe eines schlauen buches beizubringen. als übrung hab ich mal paar zeilen geschrieben, wo zuerst int und double-werte eingegeben werden können, bis der int-wert 0 ist. danach soll miut getline eine zeile eingelesen werden(vor- und nachname). das getline scheint er aber zu überspringen. Er gibt einfach nur aus:

    Bitte Vor- und Nachname eingeben:
    Programmende

    Hier der Code:

    //int und double
        cout << endl << "int und double:" << endl;   
        double d;
        while ((cin >> i >> d)  && (i != 0))
            cout << i << endl << d << endl;
    
        //ganze zeile als string lesen
        string name;
        cout << "Bitte Vor- und Nachname eingeben: ";
        getline(cin, name);
        cout << name;
    
        cout << "Programmende" << endl;
        cin >> i;
    

    Der scheint vielleicht noch sowas wie nen leeren string im cin-puffer zu haben und liest nichts neues mehr ein.

    wenn ich nur diesen teil

    //ganze zeile als string lesen
        string name;
        cout << "Bitte Vor- und Nachname eingeben: ";
        getline(cin, name);
        cout << name;
    

    in nem neuen Programm eingebe, dann geht das. Warum?



  • Schreib mal ein

    cin.get();
    

    vor das getline!

    PS:
    Also ich persönlich finde folgende Zeilen hässlich:

    while ((cin >> i >> d)  && (i != 0)) 
            cout << i << endl << d << endl;
    

    Besser finde ich persönlich:

    do
    {
    cout<<" Bla bla bla !";
    cin>>i;
    cout<<" Bla bla bla !";
    cin>>d;
    }
    while(i!=0);
    


  • In Deiner Version hast Du eine Endlosschleife falls es bei cin zum fehler kam @|M|



  • Okey, dann halt:

    i=0;
    do
    {
    cout<<" Bla bla bla !";
    cin>>i;
    cout<<" Bla bla bla !";
    cin>>d;
    }
    while(i!=0);
    


  • Immer noch nicht besser. Du wirst nicht drumherum kommen, den Status von cin mit in die Schleifensteuerung einzubeziehen.



  • da scheint noch ein '\n' im eingabepuffer zu stecken deshalb solltest du folgendes machen

    while (cin.get()!='\n');
    

    so kannst du das '\n' wieder rausziehen oder alternativ (aber nicht zu empfehlen):

    fflush(stdin);
    


  • Das mit der while--schleife ist geschickter, da bei vorheriger eingabe von "tab" und enter, das getline auch wieder übersprungen wird. hab das gerade getestet. warum sollte man das "flush" nicht verwenden?



  • stevewilson schrieb:

    warum sollte man das "flush" nicht verwenden?

    weils kein standard ist und somit nicht portierbar (z.b. linux kann damit glaub' ich nix anfangen).



  • besser und portierbar ist

    while(getchar()!='\n');

    man kann sich ja ein makro schreiben

    #CLEAR() while(getchar()!='\n');

    und dann immer mit CLEAR() den stream leeren.



  • Warum wollt ihr unbedingt etwas eigenes über getchar() basteln? Für das Problem liefert cin doch die korrekte Lösung: ignore().


Anmelden zum Antworten