fpurge durch anderen Befehl ersetzen
-
Hallo!
Ich fange gerade an, in der Uni die Sprache C zu erlernen und muss ein Programm schreiben, dass Zahlen größer 10 einliest und danach ausgibt.#include <stdio.h> int main(void) { int zahl; int ok = 0; printf("Bitte eine Zahl > 10 eingeben\n"); do { fpurge(stdin); ok = scanf("%d", &zahl); if (ok > 0 && zahl > 10) { printf("%d\n", zahl); return 0; } else printf("Ungueltiges Format\n"); } while (ok != EOF); }
Das Problem ist nun, dass der Befehl "fpurge(stdin)" nicht unter Linux funktioniert. Lasse ich die Zeile aber weg, passiert folgendes: Wenn man mehrere Buchstaben statt Zahlen eingibt, erscheint die Meldung "Ungueltiges Format", die Meldung erscheint aber mehrmals und zwar so oft wie die Anzahl der eingetippten Buchstaben. Wie kann ich also den Befehl "fpurge(stdin)" anders realisieren?
-
Mister-X schrieb:
Das Problem ist nun, dass der Befehl "fpurge(stdin)" nicht unter Linux funktioniert.
Tja, kommt davon, wenn man sich nicht an den Standard hält.
fpurge ist kein ANSI C Standard. Leicht angepasstes Programm unten demonstriert beispielhaft, wie es funktionieren kann, wobei *scanf mit "%d" immer nur eine Zeichenprüfung und keine Integerbereichsprüfung vornimmt, also z.B. auch "99999999999999999999999999999" als gültigen Wert für int annimmt (auch dann auch so zuweist, was dann natürlich zu unerwünschten Problemen führen kann).#include <stdio.h> int main(void) { int zahl; int ok; printf("Bitte eine Zahl > 10 eingeben\n"); do { char tmp[30]; ok = 0; if( fgets( tmp, 30, stdin ) && 1==sscanf(tmp,"%d", &zahl) ) ok = 1; if (ok > 0 && zahl > 10) { printf("%d\n", zahl); return 0; } else printf("Ungueltiges Format\n"); } while ( ok==0 ); }
-
Wutz schrieb:
if( fgets( tmp, 30, stdin ) && 1==sscanf(tmp,"%d", &zahl) )
scheint als hättest du nen richtigen buffer kopier fetisch
-
Im Prinzip ist das ein sinnvoller Ansatz, allerdings könnten 30 Zeichen etwas knapp bemessen sein. Sofern auf allen relevanten Plattformen verfügbar, könnte man sich beispielsweise auf GNUs getline-Funktion stützen.
Das Kopieren von Buffern ist hier unkritisch; wenn auf eine Benutzereingabe gewartet wird, haben wir frei nach Pareto wirklich kein Problem mit Performance. Wenn es aber wirklich jemanden stören sollte, könnte man fpurge auch einfach durch
while(getchar() != '\n');
ersetzen - das macht nicht genau das selbe, aber das, was man an dieser Stelle eigentlich eh erwartet (i.e., funktioniert auch mit umgeleitetem stdin).