cin Blockade



  • Wenn ich folgendes mache:

    int wert1 = 0;
    
    if(!(cin >> wert1))
    {
      tastatur_leeren();
    }
    

    Wenn ich nun Leerzeile oder irgendein anderes Whitespace-Zeichen eingebe, blockiert cin solange, bis ich eine Zahl eingebe. D. h. Ich kann garnicht die Tastatur leeren und erneut den Nutzer zu einer richtigen Eingabe aufrufen. Wie kann ich dieses Problem lösen?

    lg


  • Mod

    Erst einmal: Die Streamoperatoren funktionieren nicht so wie du denkst. Eingabetasten, Leertasten und anderer Whitespace werden von den formatierten Einlesefunktionen (also dem Operator >>) verworfen. Die Eingabetaste hat höchstens für deine Konsole in der das Programm läuft eine besondere Bedeutung, weil ihr drücken signalisiert, dass die Eingabe überhaupt an das Programm übergeben werden soll. Und wenn du nur die Eingabetaste drückst, dann sieht dein Programm eben nur diese und die Aktion "nächste Zahl einlesen" läuft weiter.

    Abhilfen:
    1. Wenn du vor hast, ein nicht-triviales Textinterface zu erstellen, dann guck dir am besten gleich eine Konsolenbibliothek an.

    2. Wenn du ein bisschen frickeln möchtest und sicher bist, dass dein Programm nur mit Textkonsolen als Eingabe benutzt wird, dann kannst du auch unformatierte Einleseaktionen benutzen (z.B. getline, guck mal in einer Referenz) und diese dann selber auswerten.



  • Gerade beim Einlesen von Zahlen ist es nie ganz ohne, alle Möglichkeiten auf einen Fehler wie z.B. eine Endlosschleife
    (bzw. ->unerwartete Ereignisse) auszuschließen.
    Oft wird geraten, gerade in diesem Punkt die Sicherheit zu optimieren, da das Programm in so ungefähr allen dieser Fälle abstürzt oder ein (unvermeidbares) Schließen des Programms (bzw. Fensters) provoziert.



  • Ich will eigentlich nur nach jedem Einlesen, sicher sein, dass der Tastaturpuffer leer ist. D. h. ich suche nach einer Lösung, den Tastaturpuffer 100% zu leeren.

    lg



  • Da kannst du eventuell mal nach istream::ignore() schauen. Wenn du etwas komplexeres vorhast, kannst du die Eingaben auch per getline() holen und anschließend durch einen Stringstream zerlegen lassen.


  • Mod

    Jeffson schrieb:

    Ich will eigentlich nur nach jedem Einlesen, sicher sein, dass der Tastaturpuffer leer ist. D. h. ich suche nach einer Lösung, den Tastaturpuffer 100% zu leeren.

    Das ist es ja gerade: cin steht nicht für die Tastatur sondern allgemein für die aktuelle Standardeingabe. Wenn du ganz speziell Programme schreiben möchtest, die man mit einer Tastatur steuern kann und dabei auch spezielle Eigenschaften einer Tastatur nutzen, dann musst du andere Mittel benutzen.

    In der Regel dürfte sich dieser Aufwand jedoch nicht lohnen, falls du nur einen kosmetischen Fehler in einem Übungsprogramm beseitigen möchtest.


Anmelden zum Antworten