Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C (C89 und C99) ::  Eingabebedingungen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Chefkoch90
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.08.2010
Beiträge: 2
Beitrag Chefkoch90 Mitglied 20:22:24 25.08.2010   Titel:   Eingabebedingungen            Zitieren

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.

Danke schon mal für die Antworten. ;)
pointercrash()
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.01.2005
Beiträge: 3038
Beitrag pointercrash() Mitglied 20:47:48 25.08.2010   Titel:              Zitieren

Wir wundern uns und schreiben statt fflush(stdout);
C/C++ Code:
int c;
while ((c = getchar()) != EOF && c != '\n');
C/C++ Code:
int c;
while ((c = getchar()) != EOF && c != '\n');
C/C++ Code:
int c;
while ((c = getchar()) != EOF && c != '\n');

Was war die Frage eigentlich :confused:
Chefkoch90
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.08.2010
Beiträge: 2
Beitrag Chefkoch90 Mitglied 21:46:48 25.08.2010   Titel:              Zitieren

ich wunder mich auch ehrlich gesagt grad über die antwort
Wutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 2104
Beitrag Wutz Mitglied 23:06:51 25.08.2010   Titel:              Zitieren

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.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
  }
...
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
}
...
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
C/C++ Forum :: C (C89 und C99) ::  Eingabebedingungen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

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.