Frage zum löschen des Inputpuffers
-
Der Puffer wird nicht gelöscht.
Es werden nur die Zeichen bis zum nächsten '\n' (oder EOF) gelesen.Alle weiteren Zeichen bleiben im Puffer.
Die meisten IDEs bieten die Möglichlkeit die Konsolenfenster offen zu lassen, bzw. nochmal anzeigen zu lassen.
Daher ist dein getchar gar nicht nötig.
-
das programm startet doch mit einem leeren puffer, warum sollte es in diesem fall weitere zeichen vor dem scanf aufruf geben?
-
b.b. schrieb:
das programm startet doch mit einem leeren puffer, warum sollte es in diesem fall weitere zeichen vor dem scanf aufruf geben?
Nochmal: Es gibt keinen Puffer!
Das ist ein komplett falsches Bild davon, was da abläuft und alle komplexeren Folgerungen daraus sind falsch. Du hast eine Kette von Zeichen, die geht in dein Programm rein und da kannst du nix dran ändern, du kannst nur unterschiedlich darauf reagieren. Dein Programm steuert nicht die Tastatur und auch nicht den Monitor, das machen andere Programme mehrere Abstraktionsschichten über der C-Runtime, die sind dann so nett die Zeichen von der Tastatur an dein Programm weiterzuleiten oder die Ausgabe deines Programms auf dem Monitor zu zeigen. Auf der Ebene deines Programms ist ein eventueller Tastaturpuffer längst Geschichte, weil der ganz woanders sitzt. Wenn eine der Abstraktionsebenen zwischen deinem Programm und der Tastatur entscheidet, dass dein Programm nicht mehr Zeichen von der Tastatur sondern aus einer Datei erhalten soll, dann bekommt dein Programm die Zeichen daher und dein Programm kann den Unterschied nicht feststellen! Das ist auch kein exotischer Vorgang, das Umleiten der Standard-Ein- und Ausgabe ist das kleine Einmaleins für jeden der ein unixoides System ernsthaft benutzt. Die Quelle der Zeichen ist auch nicht unbedingt gepuffert, die ganze Frage macht daher einfach keinen Sinn.
-
die über die tastatur eingegebenen zeichen müssen irgendwo zwischengespeichert werden, bevor sie mit getchar oder scanf abgeholt werden.
dieser zwischenspeicher wird üblicherweise puffer genannt, vermutlich entnommen aus dem englischen wort buffer.
(ein strom wird es erst dann, wenn ich die enter-taste drücke, dann wird - wuuuuusch - der inhalt aus dem puffer nach stdin "geströmt".)das ist doch bloß eine frage der interpretation.
die ganze c-welt benutzt das wort puffer/buffer, ich weiß gar nicht warum du da jetzt so einen hermann von machst.wenn die quelle gar nicht gepuffert wäre (was nicht heißen soll, dass sie gepuffert sein muss), dann hätten wir das problem des puffer-leerens gar nicht erst und es wäre kein "restmüll" im puffer nach einem scanf-aufruf. :p
-
Deine Vorstellung ist komplett falsch. scanf funktioniert so nicht. stdin funktioniert so nicht. Noch einmal erklär ich es dir aber nicht. Fall eben auf die Schnauze mit deinen falschen Vorstellungen, wenn du nicht lernen möchtest.
-
komplett falsch, soso, interessant. du willst mir also erzählen, dass die tastatureingabe nicht zwischengespeichert wird.
also, ich habe z.b.
int number; scanf("%d", &number);
der benutzer gibt z.b. ein: 123 und dann drückt er die eingabetaste.
für mich ist es jetzt klar, dass die zeichen '1', '2', '3' irgendwo
zwischengespeichert(gepuffert) werden müssen, bevor sie von scanf interpretiert und nach erfolgreicher auswertung und umwandlung als eine
dezimalzahl in der übergebenen variable number gespeichert werden -
für dich ist dieser puffer(zwischenspeicher) ein magic-stream.
das ist völlig im ordnung, jeder hat so seine eigene vorstellung. :pbtw. lerne ich sehr gern dazu, ich weiß gar nicht wie du auf das schmale brett kommst, dass dem nicht so wäre.
-
Wenn da ein Puffer ist, dann zeig mal, wie man ihn löscht.
-
SeppJ schrieb:
Wenn da ein Puffer ist, dann zeig mal, wie man ihn löscht.
gern.
int c; while ((c = getchar()) != EOF && c != '\n') ;
wenn zeichen noch im puffer waren, sind sie nach dem
abarbeiten der schleife nicht mehr per getch, scanf, fgets, etc. zugänglich.
ob die zeichen wirklich noch im puffer stehen, oder intern lediglich ein zeiger verbogen wurde, ist prinzipell wurst.
für den anwendungsprogrammierer hat das den effekt einer pufferleerung
(oder von mir aus auch eines leeren zeichenstroms).
-
Der "Puffer" wird nicht geleert.
Eingabe1 einige Zeit warten (oder lange Berechnung) Puffer leeren Eingabe2
Wenn der Puffer geleert wird, sollte nichts von den Eingaben während der Wartezeit bei der Eingabe2 auftauchen.
Bei dem
while ((c = getchar()) != EOF && c != '\n');
wird aber nur bis zum ersten '\n' aus dem Stream gelesen. Der Rest bleibt drin.
-
Und du glaubst wirklich, dass ich nicht genau diese falsche Antwort erwartet habe?
Dieses Programm löscht eine Zeile, ganz egal wann oder wie diese eingegeben wurde. Ist keine ganze Zeile da, dann wartet es, bis irgendwoher ein Zeilenumbruch kommt. Nix vonwegen Puffer löschen, die Zeile muss sogar eventuell noch eingegeben werden und wird dann ignoriert!
-
Der Rest bleibt drin.
kann man denn ein beispiel programmieren/konstruieren, bei dem das so ist?
das also nach der ausführung der while schleifewhile ((c = getchar()) != EOF && c != '\n');
noch weitere zeichen mit getchar, scanf, fgets etc. eingelesen und angezeigt werden können?
-
b.b. schrieb:
kann man denn ein beispiel programmieren/konstruieren, bei dem das so ist?
-
SeppJ schrieb:
b.b. schrieb:
kann man denn ein beispiel programmieren/konstruieren, bei dem das so ist?
haha, sehr witzig!
-
b.b. schrieb:
kann man denn ein beispiel programmieren/konstruieren, bei dem das so ist?
das also nach der ausführung der while schleifewhile ((c = getchar()) != EOF && c != '\n');
noch weitere zeichen mit getchar, scanf, fgets etc. eingelesen und angezeigt werden können?
Setzt meinen Pseudocode in C um.
Direkt nach der ersten Eingabe drückst du die Entertaste mehrmals.
-
DirkB schrieb:
Direkt nach der ersten Eingabe drückst du die Entertaste mehrmals.
dadurch schreibt scanf wieder ein \n in den puffer rein, ist doch klar das der puffer dann nicht mehr leer ist.
-
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ßendemwhile ((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 zeilewhile ((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!
-
b.b. schrieb:
SeppJ schrieb:
b.b. schrieb:
kann man denn ein beispiel programmieren/konstruieren, bei dem das so ist?
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.)