std::cin Wie leert man den Puffer richig?



  • Hallo,

    ich entwickle eigentlich mit Codeblocks, habe aber folgendes Problem:

    Ich muss den Puffer leeren, damit das "ENTER" verschwindet.

    std::cin >> mode; // Eingabe wird mit ENTER bestätigt, welches dann noch rumschwirrt
    
    //ENTER aus Puffer entfernen
    std::cin.ignore();
    
    // anschließend string einlesen
    std::getline ( std::cin, string) ;
    

    Mit dem MinGW Compiler von Codeblocks hat sowohl cin.get(), als auch cin.ignore() funktioniert.

    Wenn ich das gleiche Proejekt nun mit Visual C++ Version 6.0 übersetze, führen oben besagte Methoden dazu, dass ich meine string-Eingabe zweimal mit ENTER besätigen muss.

    Wenn ich im VisualC++ stattdessen cin.clear() aufrufe, klappt alles.

    Dafür ist dann in Codeblocks das cin.clear() wirkungslos, bzw meine string-eingabe wird einfach übergangen, ohne dass ich die Möglichkeit habe etwas einzugeben.

    Wie ist der Puffer nun korrekt zu leeren, damit das mit beiden compilern die gleichen Resultate hat?



  • clear() setzt nur die Fehlerflags zurück (wenn welche gesetzt waren), ignore(n,c) entsorgt Zeichen aus dem Eingabepuffer (bis es entweder n Zeichen gelöscht hat oder auf das Zeichen c stößt)*. Also sollte die Lösung mit ignore() eigentlich das machen, was du erwartest - zur Sicherheit könntest du nur etwas andere Werte angeben: cin.ignore(std::numeric_limits<size_t>::max(),'\n'); .

    *Defaultwerte sind n=1 und c=EOF



  • Mit codeblocks compiliert habe ich somit (cin.ignore(std::numeric_limits<size_t>::max(),'\n') ) jetzt den Effekt, dass ich wieder den String nicht eingeben kann.

    Visual C++ scheint den Puffer damit nicht zu leeren, da ab der Stringeingabe gar keine Eingabe mehr möglich ist (std::cin >> mode hat dann immer schon einen Wert)



  • Was hast du dem Programm denn für die cin>>mode Eingabe zu schlucken gegeben? Wenn dort Buchstaben gekommen sind (und mode ein int-Wert ist), schaltet der Stream das failbit ein - und verweigert vorübergehend die Zusammenarbeit, bis du es zurückgesetzt hast.



  • CStoll schrieb:

    Was hast du dem Programm denn für die cin>>mode Eingabe zu schlucken gegeben? Wenn dort Buchstaben gekommen sind (und mode ein int-Wert ist), schaltet der Stream das failbit ein - und verweigert vorübergehend die Zusammenarbeit, bis du es zurückgesetzt hast.

    mode ist ein integer und es wurde auch nur eine Zahl und ENTER eingegeben.


Anmelden zum Antworten