Probleme mit scanf() und dem stdin-Stream

Hallo

Bitte schaut euch doch mal folgenden C-Code an und sagt mit ob meine Überlegungen dazu richtig sind.

#include 

int main (void) {
 int i;
 do {
 scanf("%d", &i);
 printf("i: %d\n", i);
 getchar();
 } while (i != 0);
 return 0;
}

Angenommen die Zeile: getchar(); ist auskommentiert.
scanf("%d", &i ) „beobachtet“ die stdin. Nach dem Betätigen der Eingabetaste(’\n’) wird die Eingabe auf das Formatierungszeichen hin geprüft. Wird also ein Integer gelesen (Bsp.:„1\n“), so wird der Puffer der stdin geleert und die Eingabe in i geschrieben.
Wird aber nun ein Character gelesen (Bsp:„c\n“), so wird die Eingabe zwar in i geschrieben, der Puffer aber nicht geleert.
Die Folge ist also eine Endlosschleife.

Das Programm mit der Zeile: getchar();
Wenn ein Integer eingegeben wird, wird der Puffer der stdin geleert und die Eingabe in i geschrieben. Die Funktion getchar() tut dabei nix, weil der Puffer ja leer ist. Wird jetzt ein Chracter ‚a‘ eingegeben, sieht der Puffer so aus: „a\n“. getchar() nimmt jetzt das ‚a‘ aus dem Puffer und nur der Zeilenumbruch
bleibt übrig und scanf() kann wieder arbeiten.
Ich hoffe meine Überlegungen sind richtig und der stdin Stream und getchar() arbeiten nach dem FIFO Prinzip.

gruß

matthias

Hallo

Angenommen die Zeile: getchar(); ist
auskommentiert.

scanf("%d", &i ) „beobachtet“ die stdin. Nach dem Betätigen
der Eingabetaste(’\n’) wird die Eingabe auf das
Formatierungszeichen hin geprüft. Wird also ein Integer
gelesen (Bsp.:„1\n“), so wird der Puffer der stdin geleert und
die Eingabe in i geschrieben.
Wird aber nun ein Character gelesen (Bsp:„c\n“), so wird die
Eingabe zwar in i geschrieben, der Puffer aber nicht geleert.
Die Folge ist also eine Endlosschleife.

Das ist der scanf-character-bug vom alten Visual Studio.
Du mußt nach jedem scanf(…) welches nicht-konvertierte
Zeichen enthalten könnte, mit fflush(stdin) einen leeren
Eingabepuffer herstellen. Das nichtkonvertierte Zeichen ‚c‘
bleibt einfach im Eingabepuffer stehen (bis Du es mit
z.B. getchar() o.ä. rausholst).

Ich hoffe meine Überlegungen sind richtig und der stdin Stream
und getchar() arbeiten nach dem FIFO Prinzip.

Getchar holt einfach das ‚c‘, wenn es nach sscanf noch
im Eingabepuffer ist.

#include 

 int main (void) 
{
 int i = 0;
 
 do {
 int fields = scanf("%d", &i);
 fflush(stdin); /\* avoid Visual C's scanf("%c") bug \*/
 printf("i: %d (fields: %d)\n", i, fields);
 /\* getchar(); \*/
 } while( i != 0 );

 return 0;
}

Grüße

CMБ