Zweimal 'getchar()' geht nicht?
-
Hallo,
ich möchte nacheinander zwei Zeichen abfragen:
int main(){ char c1,c2; printf("zeichen c1 angeben:"); c1=getchar(); printf("zeichen c2 angeben:"); c2=getchar(); printf("\nc1: %c, c2: %c\n",c1,c2); return 0; }
Bei der Ausführung rauscht das Program an der zweiten Abfrage vorbei
, warum und wie mache ich es richtig
zeichen c1 angeben:x
zeichen c2 angeben:
c1: x, c2:Danke
jac
-
Es rauscht nicht an der zweiten Abfrage vorbei, sondern liest dort das '\n' ein. Ignorieren kannst du das z.B. so:
char c1,c2; printf("zeichen c1 angeben:"); c1=getchar(); fflush(stdin); // <-- Änderung printf("zeichen c2 angeben:"); c2=getchar(); printf("\nc1: %c, c2: %c\n",c1,c2);
Gruß
Entyl Sa
-
fflush(stdin) ist Blödsinn, siehe FAQ.
Siehe Konsolen FAQ wie man den Buffer leert.
Oder verwende einfach scanf("%c\n", &c);
-
Shade Of Mine schrieb:
fflush(stdin) ist Blödsinn, siehe FAQ.
Siehe Konsolen FAQ wie man den Buffer leert.
Oder verwende einfach scanf("%c\n", &c);
Nichts desto trotz funktioniert es bei mir.
Aber wenn du das sagst, und im FAQ erläuterst, dann glaube ich dir das auch.
Jetzt will ich nur noch meine Quelle angeben, wo im Prinzip genau das gleiche gemacht wird. Auf http://www.cplusplus.com/ref/#libs stdio.h -> fflush ist folgender Beispielcode zu finden:/* fflush example */ #include <stdio.h> int main() { int n; char string[80]; for ( n=0 ; n<2 ; n++ ) { printf( "Enter some words: " ); scanf( "%s", string ); printf( "The first word you entered is : %s\n", string ); fflush ( stdin ); } return 0; }
Gruß
Entyl Sa
-
Shade wofür ist fflush() denn sonst gedacht?
-
SirLant schrieb:
Shade wofür ist fflush() denn sonst gedacht?
Bin zwar net Shade, aber:
Laut seinem FAQ Eintrag z.B. für output streams.
Also um hier z.B.:printf("Ausgabe\n"); fflush(stdout);
Eine sofortige Ausgabe zu erzwingen, und nicht abzuwarten bis der Buffer so rausgeschrieben wird.
Sonst schreibt er dort auch noch was von "update stream in which the most recent
operation was not input" da kann ich aber kein Beispiel liefern.
-
Entyl_Sa schrieb:
Sonst schreibt er dort auch noch was von "update stream in which the most recent
operation was not input" da kann ich aber kein Beispiel liefern.Ganz einfach: du kannst eine Datei auch als 'Read/Write' öffnen, also schreiben UND lesen. Dann kannst du auch fflush() machen - aber nur, wenn du als letztes nichts gelesen hast (sprich: wenn du etwas geschrieben hast)
Ich habe nicht gesagt, dass fflush(stdin) nicht funktioniert, es ist nur nicht definiert aka undefiniert. Folglich würde ich mich auf nix verlassen. Siehe Konsolen FAQ für eine standard Lösung.
-
Hallo zusammen,
vielen Dank für Eure Erklärungen. Nun weiss ich, dass das Vorbeirauschen am Enter im Puffer liegt, allerdings klappt das Leeren bei mir immer noch nicht. Ich habe:
1.) dieses fflush(stdin); wie vorgeschlagen direkt nach dem 'c1=getchar();' ohne Probleme reinkompiliert und gestartet. Es funktioniert aber nicht und die Zweite Abrage kommt nicht zu stande. Also habe ich das mit 'scanf()' Versucht:
- Das von Shade Of Mine vorgeschlagenes scanf("%c\n", &c); funktioniert zwar, allerdings kommt hier die zweite printf()-Anweisung nicht.
Was ist hier faul? (BTW: Ich benutze Debian-Linux (xterm)).
Danke
jacPS: Ich habe mich nach dem empfohlenen Konsolen FAQ todgesucht. Die Suchfunktion habe ich auf verschiedene Möglichkeite gefoltert, ich finde aber dieses verdammte Konsolen FAQ nicht. In keinem Forum und in keinem FAQ-Bereich (ANSI-C+DOS-WinKonsole). Könnte mir jemand, der weiss, wo es versteckt wurde, mit nem Link aushelfen? Danke!
-
In den FAQs habe ich in der Tat auch nichts über das leeren eines Buffers gefunden. Aber die Suchfunktion hat mir einen Thread geliefert, wo jemand genau dein Problem auch hatte. Also guck mal hier