Frage zum löschen des Inputpuffers



  • scanf ist das '\n' beim einlesen von Zahlen egal.
    Da werden Whitespace überlesen.
    Das Problem tritt dann auf, wenn danach das '\n' zur Eingabe passt, wie bei fgets oder getchar.

    scanf schreibt auch nur das erste Zeichen, das nicht mehr zum Formatspecifier passt, in den Eingabestrom zurück.
    Das können alle möglichen Zeichen sein. Bei %d z.B. die Buchstaben und die Sonderzeichen (bis auf + oder - am Anfang).
    Bei %o sogar die 8 und 9.

    Nimm das Beispiel vom TO und schreib in Zeile 17 einen Wartebefehl (sleep(30) oder ähnliches).
    In der Zeit (30 Sekunden) kannst du dann Eingaben machen (mit Entertaste). Da kommt kein scanf vor, das irgendwas "in den Puffer schreibt".



  • okay, ich habe einen weg gefunden, nämlich die eingabe über den NUM-block
    ( mehrmaliges alt+10 nacheinander ),
    dass nach einem entertasten-druck und
    anschließendem

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

    noch weitere \n im puffer bleiben 😞 . nachprüfbar mit:

    int c;
    	getchar();
    	while ((c = getchar()) != EOF && c != '\n'); 
    	while(1)
    		printf("%d,", getchar());
     }
    

    eingabe z.b.:
    alt+10 alt+10 alt+10 ENTER
    ausgabe:
    10,10,

    😡 verdammt 😡



  • dann muss ich wohl oder übel meine aussage korrigieren:
    die zeile

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

    kann den eingabepuffer löschen. 😃
    (wer gibt schon alt+10 per numblock ein ... :P)
    🙂



  • danke an seppj und dirkb für die belehrungen! 👍
    sonst wäre ich wohl nicht auf die idee gekommen, meinen eigenen bockmist zu
    widerlegen! 😃
    🙂


  • Mod

    b.b. schrieb:

    SeppJ schrieb:

    b.b. schrieb:

    kann man denn ein beispiel programmieren/konstruieren, bei dem das so ist?

    http://ideone.com/1oh03

    haha, sehr witzig!

    Das ist nicht witzig, sondern das ist der gleiche Effekt wie bei deinem Num-Block Beispiel und somit hoffentlich lehrreich. Es gibt eben keinen Puffer den man löschen kann. Siehe meine diversen Beiträge aus Seite 1, dass die Annahme, dass ein C-Programm irgendetwas mit der Tastatur veranstalten würde falsch ist. Die Tastatur wird irgendwie vom Betriebssystem ausgelesen. Der Terminalemulator (oder wie auch immer das bei deinem OS heißt) fragt das Betriebssystem nach Zeichen und schickt diese weiter an den Zeileninterpreter, dieser wartet auf ganze Zeilen (deswegen kann man Eingaben auch editieren, ohne dass du in deinem Programm dafür Vorkehrungen treffen musst, das passiert alles lange vorher), dieser schickt die Zeichen dann weiter als dein Programm, dann und nur dann, wenn die Tastatur als stdin deines Programmes festgelegt wurde (was z.B. bei ideone nicht der Fall ist). Da sind zwar mehrere Puffer auf dem Weg, aber dein Programm sieht wirklich nur noch den Zeichenstrom. Dieser beinhaltet keine Zeitinformation, keine Information über das was noch kommt, wie viel noch da ist oder das was vorher war. Bloß einzelne Zeichen. Eines nach dem anderen.

    (In der obigen Darstellung ist eventuell falsch dargestellt, welche Instanz was genau macht. Vielleicht habe ich auch noch ein paar Stufen vergessen. Im Prinzip ist es mir auch egal (aber besser belehren lasse ich mich gerne), wichtig ist in diesem Unterforum nur, was bei einem Programm in einer standardkonformen C-Runtime ankommt.)



  • das ist zwar nicht der gleiche effekt, da es sich bei dir quasi um zwei separate eingaben handelt, aber bevor es in weitere, seitenlange diskussionen ausartet, sollten wir hier stoppen, schlage ich vor.

    das m.m.n. wichtigste, dass nämlich ein

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

    nicht in jedem fall zu einem leeren puffer führt ist, denke ich mal, sehr
    deutlich rübergekommen.
    (ob zeichenstrom oder puffer, bleibt aus meiner sicht immer noch eine frage der interpretation.(aber auch hier lasse ich mich gern eines besseren belehren.))


Anmelden zum Antworten