Hilfe



  • C Standard schrieb:

    Vielen Dank SeppJ für die überflüssige Antwort eines Moderators.
    Ich weiß nicht was dein Problem ist. Aber so is das wohl manchmal . . .

    Sorry, aber er hat schon Recht. Du hast deine Frage recht unpräzise gestellt (was wird doppelt ausgeführt?) und den Code unleserlich gepostet (C++-Tags!).

    C Standard schrieb:

    _matze: Ich bin ganz neu in dem Gebiet. Ich hab den Cygwin Compiler. Und wenn ich das Programm (Übungsprogramm) starte und z.B. die Taste "a" drücke kommt das nächste Feld doppelt und erst dann habe ich einen neuen Versuch. Vielen Dank für die Antwort

    Ich vermute mal, dass der Cygwin mit fflush(stdin) nicht das macht, was du möchtest, nämlich den Eingabepuffer vor der nächsten Eingabe leeren. fflush(stdin) erzeugt undefiniertes Verhalten (Ausnahme: Microsoft-Compiler). Du findest hier im Forum genügend Alternativen (einfach mal suchen nach "Eingabepuffer leeren").



  • Hey!

    Wenn du eine Lösung gefunden hast, schreib sie mal Bitte. Würde mich interessieren wie du's gelöst hast! 😉

    Wenn du das nächste mal so eine Situation hast, versuch dir doch erstmal Testausgaben zu machen, so als kleiner Tipp. Du kannst dann auch gerne int-Werte ausgeben. Wenn du das in deinem Fall machst, siehst du, dass "eingabe" beim zweiten durchlauf den Wert 10 zurückgibt, welcher Laut ascii tabelle für LF(Zeilenvorschub) steht. Damit ist klar, dass der Puffer nicht richtig geleert wird. Bei mir klappt es mit

    __fpurge(stdin);
    

    anstatt fflush();. Laut man page wohl nicht unter jedem System, aber du kannst es ja mal probieren. 😃

    Lieben Gruß



  • C Standard schrieb:

    Vielen Dank SeppJ für die überflüssige Antwort eines Moderators.
    Ich weiß nicht was dein Problem ist. Aber so is das wohl manchmal . . .

    Wenn du hier im Forum weiter mitmischen willst, wäre ein anderer Stil für Fragen und Rückantworten sehr hilfreich oder du wirst nicht ernst genommen! 😃



  • Und noch jemand der seinen Senf dazu geben möchte . . .



  • marvNN

    Vielen Dank 🙂

    Du hattest recht. Bei dem Compiler geht fflush nicht sondern fpurge.

    Perfekt 😉



  • Ich zitier mal die fpurge-Manpage:

    Usually it is a mistake to want to discard input buffers.

    Lass diesen Unfug sein. Du weißt nie, was genau du damit wegwirfst - spätestens, wenn dir mal jemand eine Datei nach stdin umleitet, kommst du mit solchen Angewohnheiten in Teufels Küche.



  • C Standard schrieb:

    marvNN

    Vielen Dank 🙂

    Du hattest recht. Bei dem Compiler geht fflush nicht sondern fpurge.

    Perfekt 😉

    Nö, nicht perfekt. Befolge doch mal meinen Ratschlag. Dann findest du nach kurzer Recherche eine standardkonforme Lösung, die unter allen Umständen funktioniert (tut deine nicht).



  • int c;
    while ((c = getchar()) != EOF && c != '\n');
    

    Können wirs dann damit bitte abschließen? 😃


  • Mod

    marvNN schrieb:

    int c;
    while ((c = getchar()) != EOF && c != '\n');
    

    Können wirs dann damit bitte abschließen? 😃

    Jain. Die eigentliche Ursache des Problems ist nämlich nicht, dass noch Zeichen im Puffer stehen. Das Verwerfen dieser Zeichen bekämpft nur die Ursache, aber der beste Beitrag in diesem Thread sagt eigentlich alles:

    seldon schrieb:

    Ich zitier mal die fpurge-Manpage:

    Usually it is a mistake to want to discard input buffers.

    Lass diesen Unfug sein. Du weißt nie, was genau du damit wegwirfst - spätestens, wenn dir mal jemand eine Datei nach stdin umleitet, kommst du mit solchen Angewohnheiten in Teufels Küche.

    Das eigentliche Problem ist hier, wie das Programm auf die Eingabe von Whitespace reagiert. Dies muss ausgebessert werden (das mache ich dem Threadersteller aber erst vor, wenn er verständlich danach fragt :p ). Wenn ein Benutzer "abc\n" oder auch "a b c\n" eingibt, dann will er sicherlich die Aktionen a, b und c durchführen und nicht, dass seine Eingabe verworfen wird, da er nicht bestimmte, willkürliche Zeichen zwischen seine Eingaben gesetzt hat.

    Oder falls man sich doch in den Kopf gesetzt hat, ein textbasiertes Menüsystem (z.B. a la vi) zu schreiben, dann nehme man auch wirklich eine Konsolenbibliothek, die eine Lösung für die dabei auftretenden Probleme bietet, die der C-Standard (da er Konsolen nicht kennt) nicht lösen kann.



  • SeppJ schrieb:

    ... das mache ich dem Threadersteller aber erst vor, wenn er verständlich danach fragt :p ...

    Das tut er aber nicht. Er empfiehlt sich zur Wahl 'NoGo-Poster 2012' :p


Anmelden zum Antworten