Eingabebedingungen
-
Ich bin schon lange am grübeln, aber ich habe noch keine richtige Lösung gefunden. Und zwar erstelle ich zur Zeit für die Ausbildung verschiedene kleine Programme und habe mich immer gefragt, wie kann man es bewerkstelligen, dass bei der Eingabe nur bestimmte "Werte" akzeptiert werden.
Praktisch es soll z.B. ein Wert zwischen 1 und 10 eingegeben werden. Er soll also keine Zahlen drunter und drüber sowie Buchstaben oder Sonderzeichen akzeptieren.
Ich habe das Ganze mit einer if-Abfrage bewerkstelligt, wo man dann ja quasi eine while-Schleife einbauen kann bis ein richtiger Wert eingegeben wird.
printf("Bitte geben Sie eine Zahl zwischen 1 und 10 ein: "); fflush(stdout); scanf("%d", &a); if ((a < 11) && (a > 0)) { printf("Richtige Eingabe!"); } else { printf("Falsche Eingabe"); }
Da dies ja aber ziemlich aufwendig und nicht gerade wenig Code für eine eigentlich simple Abfrage ist, woltle ich mal fragen, welche Erfahrungen ihr damit macht und wie ihr das bewerkstelligt.
Danke schon mal für die Antworten.
-
Wir wundern uns und schreiben statt fflush(stdout);
int c; while ((c = getchar()) != EOF && c != '\n');
Was war die Frage eigentlich
-
ich wunder mich auch ehrlich gesagt grad über die antwort
-
Wenn du dich auf eine Ein-Zeichen-Eingabe (mit abschließendem <Enter>) beschränken würdest, könnte eine Variante z.B. mittels switch gestaltet werden, im case-Zweig könnte dann eine Funktion aufgerufen werden, die die eigentlich Arbeit übernimmt.
int liesZeichen(void) { int c; while( (c=getchar())=='\n' ); while( !feof(stdin) && getchar()!='\n' ); return c; } main() { int abbruch=0; ... while( !abbruch && printf("\nBitte geben Sie eine Zahl zwischen 0 und 9 ein (0=Ende): ") ) switch(liesZeichen()) { case '1': puts("1"); break; ... case '9': puts("9"); break; default: abbruch=1; } ... }
Andere Zeichen wie a..z etc. sind natürlich ebenfalls möglich.
Ein Problem, und deshalb auch die o.g. noch längere als deine Variante, ist bei terminalbasierten Nutzereingaben in ANSI C, dass eine gepufferte und keine synchrone Zeicheneingabe möglich ist. Man muss quasi die Eingabepufferverwaltung selbst kontrollieren um halbwegs alle Nutzereingabevarianten bis zum <Enter> behandeln zu können. Synchrone Lösungen wie auch die "fflush(stdin)"-Variante sind plattformabhängig und somit kein ANSI C mehr. Hierzu siehe weiter auch FAQ + Google.