Eingabebuffer leeren - optionen



  • Guten Abend zusammen!

    Ich habe eine kurze Frage:
    Wie kann man OHNE das obligatorische einlesen bis zur Newline den Puffer leeren?

    Ich finde das "Lesen solange bis \n && EOF kommt", nicht so prima.

    Das fflush(stdin) funktioniert unter Windows, solange man nur Windows-Code schreibt, kann man auf den Standard pfeifen. Unter Windows ist es auch nicht, wie immer gesagt wird "undefiniertes Verhalten", sondern ein "Feature", was unter Windows legitim ist -> kein mögliches undefiniertes Verhalten.

    In einem (Windows) Code den ich neulich geschrieben habe, habe ich mal eine andere Option getestet:

    static char pb[BUFSIZ];
    
    setbuf(stdin, pb);
    
    // input...
    fgets(...);
    
    // clear
    memset(pb, 0, sizeof(pb));
    setbuf(stdin, pb);
    
    // input2...
    fgets(...);
    

    Wenn ich Input 1, überlade(z.b. Buffer 20 Elemente, ich tippe aber z.b. 30 Zeichen), überspringt er Input 2 in dieser Konstellation nicht.

    Mich würde mal interessieren ob das auch unter Linux funktioniert.

    Lieben Gruß



  • Kohlmanns123 schrieb:

    static char pb[BUFSIZ];
    
    setbuf(stdin, pb);
    
    // input...
    fgets(...);
    
    // clear
    memset(pb, 0, sizeof(pb));
    setbuf(stdin, pb);
    
    // input2...
    fgets(...);
    

    Das ist UB. setbuf() nach einem fgets() auf dem selben stream.


  • Mod

    Die Idee des Eingabepuffers ist falsch, daher werden auch deine Versuche allesamt nicht fruchten, diesen ominösen Puffer zu leeren.

    Dein Programm sitzt in einer schwarzen Kiste, da kommt aus der Außenwelt ein Papierband rein, auf den Zeichen geschrieben stehen. Da sind keine Farben, keine Zeitstempel, keine Trennstriche. Nichts außer Zeichen, eines nach dem anderen. Wo, wie, wann oder warum diese Zeichen auf das Band gekommen sind, kann dein Programm nicht wissen.

    Das setbuf ist etwas internes für dein Programm, etwas was innerhalb der schwarzen Kiste geschieht. Es ist ein Pufferspeicher, den die Lesefunktionen nutzen können, wenn sie von dem Papierband lesen. Was auf dem Papierband steht, bleibt davon unbeeinflusst.



  • Aus gegebenem Anlaß nochmal 'ne Anregung:
    Eigentlich stand's ja hier mit ausführlicher Begründung: fflush(stdin)
    Nur sind die FAQs reichlich verschämt und unscheinbar rechts oben untergebracht, entsprechend selten wird das eine oder andere gelesen.

    Hmmm, kann man das nicht etwas auffälliger unterbringen 😕
    🙄


  • Mod

    pointercrash() schrieb:

    Hmmm, kann man das nicht etwas auffälliger unterbringen 😕
    🙄

    Prinzipiell ja. Bringt aber nichts. Wie dir vielleicht auffällt, ist zum Beispiel im C-Forum ein dicker, gelber Kasten mit wichtigen Informationen ganz oben. Sogar mit komfortabler Direktauswahl für FAQs. Nimmt aber niemand wahr, weil Leute einfach dazu erzogen sind, solche Dinge zu übersehen. Wahrscheinlich sehen viele Leuten erst jetzt in diesem Moment, in dem sie davon lesen, dass es diese Informationsabschnitte gibt und jedes Unterforum seinen eigenen hat. Mir jedenfalls fielen sie auch das erste Mal erst nach vielen Jahren auf und das auch nur, als sie einmal zufällig meine Moderationstätigkeit beeinflussten.

    edit: Peinlichen Rechtschreibfehler korrigiert 😃



  • Den Typo im letzten Satz möchtest Du sicherlich noch korrigieren. 😉

    Wie dem auch sei. IMHO ist der Ton den der OP anschlägt ziemlich herablassend für ein Forum, dessen Thema explizit Standard C ist.
    Ich weiss auch gar nicht, warum Kohlmanns123 fflush(stdin) überhaupt erwähnt?! Wahrscheinlich hat der Mann einen Hals, wegen der mitunter schroffen Beiträge zu diesem Thema hier...

    Kohlmanns123 schrieb:

    Das fflush(stdin) funktioniert unter Windows, solange man nur Windows-Code schreibt, kann man auf den Standard pfeifen. Unter Windows ist es auch nicht, wie immer gesagt wird "undefiniertes Verhalten", sondern ein "Feature", was unter Windows legitim ist -> kein mögliches undefiniertes Verhalten.


  • Mod

    Nur so als Nebenbemerkung: Unter Linux ist fflush auf Eingabestreams durchaus auch definiert, zumindest seit ein paar Jahren. Der Endeffekt ist bloß nicht der, den die typischen fflush(stdin)-Nutzer erwarten. Und zwar aus den Gründen, die ich oben genannt habe, denn die Idee eines zentralen Eingabepuffers ist schlicht falsch.



  • SeppJ schrieb:

    Prinzipiell ja. Bringt aber nichts...

    Ja, da leckst mi!
    Ist mir auch noch nie aufgefallen! 🙄
    Ich hab' mich immer drüber geärgert, daß man zum Forenüberblick navigieren und scrollen muß, bis man zu den FAQs kommt und erinnere mich auch nicht immer an den Schnelltag rechts oben.
    Jetzt würde ich uns beide nicht wirklich informationsresistenten Nörglern zuordnen und möchte auch Gelegenheits- Forenbesucher nicht pauschal dort verorten.

    Also, entweder sind wir alle Deppen oder das Ding ist informationspsychologisch (gibt's das Wort überhaupt?) so ungünstig untergebracht, daß wir's allesamt überlesen. Das könnte geändert werden, dessen bin ich mir sicher.


  • Mod

    pointercrash() schrieb:

    Also, entweder sind wir alle Deppen oder das Ding ist informationspsychologisch (gibt's das Wort überhaupt?) so ungünstig untergebracht, daß wir's allesamt überlesen. Das könnte geändert werden, dessen bin ich mir sicher.

    Ich vermute wirklich, dass es eine psychologische Sache ist, aber ich habe keine Ahnung, wie es zu ändern wäre. Die Leute, die FAQ-Fragen stellen, wollen keine FAQ lesen. FAQs sind etwas für Poweruser, die sie aber naturgemäß selten brauchen.



  • Hallo,

    offensichtlich habt ihr das nicht mal ausprobiert, was ich relativ schade finde. Sorry für den Ton, falls sich dort jemand auf den Schlips getreten gefühlt hat. Deshalb muss man noch lange nicht irgendwelchen Müll von sich geben! 😉

    Dann mache ich mal den First Step.

    Im Testfall 1 sind die setbufs u. memset ausgeklammert.
    Im Testfall 2 so wie unten dargestellt.

    Betriebssystem: Windows 8.1 Compiler GCC, IDE Codeblocks

    Ihr könntet das ja bei euch einfach mal testen, ob es funktioniert, speziell die Linux/Unix User. Würde mich aufjedenfall interessieren.

    Der Code:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        static char pb[BUFSIZ];
        char buffer1[10];
        char buffer2[10];
    
        // Umleiten
        setbuf(stdin, pb);
    
        // Eingabe 1
        puts("Bitte geben Sie etwas ein:\n");
        fgets(buffer1, sizeof(buffer1), stdin);
    
        // Löschen und erneu umleiten
        memset(pb, 0, sizeof(pb));
        setbuf(stdin, pb);
    
        // Eingabe 2
        puts("Bitte geben Sie noch etwas ein:\n");
        fgets(buffer2, sizeof(buffer2), stdin);
    
        // Ausgabe
        printf("Eingabe 1: %s\n", buffer1);
        printf("Eingabe 2: %s\n", buffer2);
    
        return 0;
    }
    

    Test 1:

    Bitte geben Sie etwas ein:
    
    HalloWelt12345
    Bitte geben Sie noch etwas ein:
    
    Eingabe 1: HalloWelt
    Eingabe 2: 12345
    
    Process returned 0 (0x0)   execution time : 11.786 s
    Press any key to continue.
    

    Test 2:

    Bitte geben Sie etwas ein:
    
    HalloWelt12345
    Bitte geben Sie noch etwas ein:
    
    TEST
    Eingabe 1: HalloWelt
    Eingabe 2: TEST
    
    Process returned 0 (0x0)   execution time : 10.816 s
    Press any key to continue.
    

    P.S. Ich hatte doch glatt vergessen, dass ich hier etwas geschrieben habe. Besser spät als nie 🙂

    Grüße

    Kohlmanns123


  • Mod

    Kohlmanns123 schrieb:

    offensichtlich habt ihr das nicht mal ausprobiert, was ich relativ schade finde.

    Was ausprobiert? Dein Programm mit undefiniertem Verhalten? Mag bei dir funktionieren, undefiniert heißt auch, dass es manchmal funktionieren darf. Es bleibt aber weiter undefiniert. Auch wenn dir das als Antwort nicht passt, ist es trotzdem die korrekte Antwort.



  • Hallo,
    wenn man etwas behauptet, dann begründet man dies mit einem Verweis, was du offensichtlich nicht machst. Ich nehm dir das nicht übel, aber sowas lernt man bereits in der Schule.

    Von einem undefinierten Verhalten ist nirgendwo die Rede.
    Da ich den Buffer zusätzlich Static deklariert habe, ist dieses ebenso hinfällig:

    You must make sure that the space that buf points to still exists by the time stream is closed, which also happens at program termination.
    

    Quelle: http://linux.die.net/man/3/setbuf

    Wenigstens habe ich getestet, womit du offensichtlich überfordert bist, oder in deinen alten Strukturen gefangen.

    Oder hast du Angst, mein Programm würde deine Computer Hardware zerstören?

    Schönen Abend noch.


  • Mod

    Wow, pöbelst du immer Leute an, die dir helfen? Dann hilf dir doch selber, wenn du sowieso alles besser weißt.



  • Von einem undefinierten Verhalten ist nirgendwo die Rede.

    Du kannst nicht lesen.

    bereits in der Schule.

    Da gehörst du auch hin.

    Da ich den Buffer zusätzlich Static deklariert habe, ist dieses ebenso hinfällig:

    Totaler Schwachsinn. Das was du gelesen hast, hast du auch nicht verstanden.

    du offensichtlich überfordert bist

    Dümmlich naiver Versuch, doch noch jemanden zu überreden, Zeit für deine Schwachsinnsthesen zu vergeuden.



  • @Kohlmanns123

    So laufen hier leider SEHR viele Threads ab, es einfach nur ein Armutszeugnis dises mittlerweile bedeutsamen Forums. du kriegst NUR solche Antworten egal was abgeht.
    Teilweise macht es Spaß Konversationen zu verfolgen, am Ende sind es IMMER die Personen die länger in diesem Forum sind die sich besser fühlen und einfach nur scheiß Antworten geben.

    Wow, pöbelst du immer Leute an, die dir helfen?

    Da pöbelt jemand ganz anderes. Und bei dem Schweinchen ist eh immer alles Schwachsinn...


Log in to reply