getchar liefert zwei Zeichen... ??
-
Javaner schrieb:
CStoll schrieb:
bis zu 'löst den vierten Weltkrieg aus')
LOL
Was denn? Das ist so.
Wenn der Standard "undefined behaviour" sagt, kann das Programm an dieser Stelle ALLES machen, was ihm in den Sinn kommt. (klar, normalerweise sind die Folgen weniger ..hmm.. dramatisch)
-
da mir nichts ferner liegt als den vierten Weltkrieg auszulösen (habe ich den dritten verpennt???), werde ich natürlich einen großen Bogen um fflush machen, obwohl es damit wunderbar funktioniert hat.
Aber mal im Ernst: Wenn fflush == Supergau hat dann jemand einen anderen, besseren, pazifistischeren Vorschlag zur standardkonformen Lösung dieses unglaublich trivialen Problems?
-
muffinmaker schrieb:
Aber mal im Ernst: Wenn fflush == Supergau hat dann jemand einen anderen, besseren, pazifistischeren Vorschlag zur standardkonformen Lösung dieses unglaublich trivialen Problems?
fflush wirft dir alle chars die im puffer stehen raus. warum nicht selber die chars ansehen und selber entscheiden ob man sie haben will und dann selber wegwerfen?
-
Werde dem Ansatz mal auf den Grund gehen...
Unterdessen habe ich fleißig weiterrecherchiert und bin zu dem vorläufigen Schluss gekommen, dass es offenbar keine Funktion gibt, die einfach nur ein einzelnes Zeichen von der Tastatur einliest...
Hätte nicht gedacht, dass sich der Umstieg auf C als so kompliziert erweistAber ich bleib dran, wär doch gelacht!
vielen Dank an alle für die schnellen und amüsanten Antworten!
-
getchar liest nur ein einzelnes zeichen ein. aber das problem ist: wenn du x + enter drückst, dann sendest du halt 2 zeichen.
-
naja, aber doch nicht ganz. Wenn man pingelig sein will, und dazu neige ich ;), muss man doch sagen, dass getchar eben nicht explizit ein Zeichen von der Tastatur entgegennimmt, sondern den Tastaturpuffer ausliest, und das auch, wenn keine Taste gedrückt wird (wie im zweiten Durchlauf der Schleife meines ursprünglichen Beispiels)... Aus meiner bisherigen Anfängersicht kommt es mir so vor, als ob getchar nicht ganz konsequent implementiert ist, wenn das Betätigen der Returntaste zur Bestätigung der Eingabe quasi Teil des Funktionsaufrufs ist (ich weiß, ich drücke mich nicht richtig aus, aber ich hoffe auf gnädige Zuhörer) sollte doch getchar eigenständig dafür sorgen, dass nur das Zeichen VOR dem Return eingelesen wird...
...aber das ist, wie gesagt, nur meine Anfängersicht der Dinge. Ich schätze dass das alles schon irgendwie Sinn ergibt, wenn ich meine Kenntnisse ausgebaut habe. Werde wohl noch viel lesen müssen um mir ein verlässliches Urteil bilden zu können
-
muffinmaker schrieb:
da mir nichts ferner liegt als den vierten Weltkrieg auszulösen (habe ich den dritten verpennt???), werde ich natürlich einen großen Bogen um fflush machen, obwohl es damit wunderbar funktioniert hat.
fflush() alleine ist durchaus erlaubt - allerdings arbeitet es offiziell nur mit Ausgabe-FILE's zusammen (und stdin ist kein Ausgabe-FILE - was fflush damit macht, liegt im Ermessen des Compiler-Bauers*).
Und was die Tastatureingabe angeht - Ansi C spezifiziert nicht, daß hinter stdin wirklich eine Tastatur liegen muß (es fordert noch nicht einmal, daß dein Rechner überhaupt eine Tastatur haben muß ;)). Und getchar() liest wirklich genau ein Zeichen aus dem Eingabepuffer von stdin. Daß die handelsüblichen Konsolen zeilengepuffert arbeiten (die Eingaben werden erst an das Programm weitergegeben, wenn sie mit ENTER bestätigt wurden), liegt nicht im Einflußbereich deines Programms. Um wirklich sofort von Tastendrücken informiert zu werden, mußt du die Standardfunktionen umgehen und direkt die Konsole ansprechen.
* Lass mich raten, du verwendest einen MS-Compiler.
-
muffinmaker schrieb:
...aber das ist, wie gesagt, nur meine Anfängersicht der Dinge.
und eine falsche sicht der dinge.
-
Shade Of Mine schrieb:
muffinmaker schrieb:
...aber das ist, wie gesagt, nur meine Anfängersicht der Dinge.
und eine falsche sicht der dinge.
...sag ich doch!
-
CStoll schrieb:
* Lass mich raten, du verwendest einen MS-Compiler.
Derzeit benutze ich die "Command Line Tools" von Borland unter Windows (ich hoffe, dass jetzt nicht mein Account gesperrt wird
) und damit klappt das mit fflush einwandfrei!
Vielen Dank für die ausführliche Erläuterung, an so viel Hardwarenähe muss ich mich erst noch gewöhnen...
Habe den gleiche Tipp übrigens auch in einem ausgewiesenen Fachbuch gefunden:
http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_005_001.htm
...werde dann wohl in Zukunft auf die Kombination fgets und sscanf zurückgreifen, die empfiehlt auch Oualline in 'Practical C'
-
muffinmaker schrieb:
Habe den gleiche Tipp übrigens auch in einem ausgewiesenen Fachbuch gefunden:
http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_005_001.htm
...werde dann wohl in Zukunft auf die Kombination fgets und sscanf zurückgreifen, die empfiehlt auch Oualline in 'Practical C'
Warum "Möglichkeit 1" nicht gut ist sollte geklärt sein. Aber die "Möglichkeit 3" tut einfach nur noch weh.
-
muffinmaker schrieb:
Wenn man pingelig sein will, und dazu neige ich ;), muss man doch sagen, dass getchar eben nicht explizit ein Zeichen von der Tastatur entgegennimmt, sondern den Tastaturpuffer ausliest, und das auch, wenn keine Taste gedrückt wird (wie im zweiten Durchlauf der Schleife meines ursprünglichen Beispiels)... Aus meiner bisherigen Anfängersicht kommt es mir so vor, als ob getchar nicht ganz konsequent implementiert ist, wenn das Betätigen der Returntaste zur Bestätigung der Eingabe quasi Teil des Funktionsaufrufs ist (ich weiß, ich drücke mich nicht richtig aus, aber ich hoffe auf gnädige Zuhörer) sollte doch getchar eigenständig dafür sorgen, dass nur das Zeichen VOR dem Return eingelesen wird...
das dumme an 'getchar' ist, dass es blockt, bis ein '\n' eingelesen wurde. dann aber nudelt es alle zeichen raus, bis der buffer leer ist. ein wirklich unschönes und denkbar unpraktisches verhalten.
ein richtig 'cooles' getchar wäre non-blocking und würde im fall von 'nichts' ein EOF o.ä. zurückliefern.
btw, das '\n' bekommst du z.b. so weg:
int getchr (void) { int c; do c = getchar(); while (c == '\n'); return c; }