Eingabe ueberpruefen
-
Hallo liebe c-Profies,
ich würde gerne eine Eingabe absichern bzw. den User solange zwingen
die Eingabe zu wiederholen bis sie richtig ist.
Bei folgendem Code scheint aber die scanf-Anweisung nur einmal ausgefuehrt zu werden!!! Wenn ich z.B. ein char eingebe, laeuft die Schleife endlos weiter und gibt dauernd "Falsche Eingabe ..." aus OHNE mich eine erneute Eingabe machen zu lassen?!?!?
Waere super wenn mir jemand helfen koennte!
Danke und LG,
Markus#include <stdio.h> #include <stdlib.h> //--------------------------------------------------------------------------- int main() { float dieZahl; printf("Bitte eine Kommazahl eingeben!\n"); while (scanf("%f",&dieZahl) != 1){ printf("Falsche Eingabe ..."); } system("pause"); return 0; } //---------------------------------------------------------------------------
-
Such mal hier im Forum nach "Eingabepuffer leeren".
-
Wenn die Eingabe nicht passt, nimmt scanf() sie nicht aus dem Puffer. Unter Windows könnte man das berüchtigte fflush(stdin) verwenden, aber da bekommst du dann von allen Rittern des Standards eins auf die Nase. (Da das Verhalten von fflush() nur für output Streams definiert wird.)
Eine Lösung wäre z.B. die Zeile zu ignorieren:
void ignore_line(FILE *f) { int c; while ((c = getc(f)) != EOF && c != '\n'); }
Oder fgets zu nutzen:
int n; char buf[32]; do { if (fgets(buf, sizeof(buf), stdin) == NULL) ; // Alles kaputt } while (!parse_number(buf, &n)) // parse_number ist eine Funktion von dir
-
Danke fuer die Hilfe!
Die Suche nach Buffer-leeren hat geholfen:#include <stdio.h> #include <stdlib.h> //--------------------------------------------------------------------------- int main() { float dieZahl; printf("Bitte eine Kommazahl eingeben!\n"); while (scanf("%f",&dieZahl) != 1){ printf("Falsche Eingabe! Bitte Kommazahl eingeben!\n"); //die loesung des problems war es den buffer zu leeren :) fflush(stdin); } system("pause"); return 1; } //---------------------------------------------------------------------------
Aber das zweite posting hat mich verunsichert - google hat ausserdem noch fpurge(stdin) vorgeschlagen, wird aber von meinem compiler nicht erkannt obwohl es in #stdio.h enthalten sein sollte.
Auf alle Faelle Danke fuer eure Hilfe!
-
fflush(stdin) ist nicht gerade portabel, es ist nicht definiert was es genau macht. Bei dir scheint es aber zu funktionieren.
-
Findet man etwa fflush(stdin), wenn man hier im Forum nach "Eingabepuffer leeren" sucht? Kann ich mir kaum vorstellen.
-
Eventuell mit fgets arbeiten, da hat man die Probleme nicht und
dann sscannf anstatt scanf. Das ist dann flexibel und man hat keine Probleme mehr mit dem Eingabepuffer, wobei fgets oder gets nicht unbedingt das sicherste sind wegen Pufferüblauf
-
fgets hat keine Probleme mit Pufferüberläufen. Daher fgets mit stdin als Quelle benutzen, wenn man eigentlich gets benutzen würde.