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.
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9 10 11
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");
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11
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");
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11
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.
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;
}
...
}
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;
}
...
}
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.
_________________ Java, the best argument for Smalltalk since C++. -- Frank Winkler
Zuletzt bearbeitet von Wutz am 23:47:40 25.08.2010, insgesamt 1-mal bearbeitet
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.