Ein/Ausgabe



  • int main()
    {
        std::string s0;
    
        for(;;)
        {
        	std::cout << "IN : ";
        	std::cin >> s0;
        	std::cout << "OUT: " << s0 << std::endl;
        	s0.clear();
        }
        return 0;
    }
    

    Warum passiert nach der Eingabe von "1 2 3" folgendes:

    IN : 1 2 3
    OUT: 1
    IN : OUT: 2
    IN : OUT: 3
    IN :

    Ich hätte eigentlich

    IN : 1 2 3
    OUT: 1

    erwartet, da laut meinem Buch der >> operator für string withespaces überliest?!



  • Ist ja auch so. Aber da du das ganze wiederholst, werden bei den nächsten beiden Durchläufen jeweils 2 und 3 eingelesen.



  • nein, er "überliest" sie nicht
    er trennt an diesen stellen.

    std::getline tut das, was du erwartest

    wenn mich nicht alles täuscht, gibt es aber auch noch ein flag:
    noskipws oder so. http://www.cplusplus.com/reference/ <- dort ma gucken

    bb



  • unskilled schrieb:

    ...
    std::getline tut das, was du erwartest
    ...

    Sehe ich nicht so, denn:

    easybreezy schrieb:

    ...
    Ich hätte eigentlich

    IN : 1 2 3
    OUT: 1

    erwartet...

    ... und das macht getline nicht.
    Du irrst dich in 2 Aspekten:
    1.) Wie oben schon angedeutet: Du füllst den instream namens cin mit "1 2 3".
    Der operator>>() liest bis zum nächsten whitespace (das er dann ignoriert - aber nicht mehr!! NUR das eine whitespace), schiebt das Ergebnis in s0 und löscht es aus cin.
    => in cin steht danach noch "2 3".

    2.)

    s0.clear();
    

    löscht nicht den Inhalt von cin (ich weiß nicht, ob du das erwartet hast, aber es sieht mir ein wenig so aus), sondern von s0.
    Das täte aber auch der nächste Aufruf von operator>>().
    Achtung: Auch ein

    cin.clear();
    

    löscht nicht den Inhalt von cin, sondern setzt nur evtl. gesetzte (Fehler-)flags von cin zurück.

    Beim nächsten Schleifendurchlauf steht in cin weiterhin "2 3" => cin ist nicht leer => cin sieht keinen Anlass dazu, die Konsole für neue Eingaben zu bemühen, sondern arbeitet die '2' ab ... und im nächsten Schleifendurchlauf eben die '3'.

    Wenn Du cin dazu bringen möchtest, nach der '1' den Rest zu ignorieren, gibt es die Funktion ignore() (die leider nicht ganz unproblematisch zu handhaben ist).

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Sehe ich nicht so, denn:

    jopp, da hab ich wohl nicht richtig gelesen...

    aber man kann es zumindest so machen:

    int x;
    std::cin >> x;
    std::string rubbish;
    std::getline(std::cin, rubbish);
    

    bb


Log in to reply