?
Katzenstreu schrieb:
Lieder kann ich euch nicht immer folgen.
Aber warum ist es so schwer Gleitkommazahlen (z.B. double) von der Tastatur einzulesen? Bei der Eingabe anderer Zeichen außer der 0 bis 9 und dem Punkt soll so lange weiter auf die Eingabe gewartet werden, bis diese gültig ist.
Sooo schwer ist es ja gar nicht. Du beschreibst hier jedoch eine neue Anforderung an den Code. Aus dieser Anforderung ergibt sich, das scanf zum Einlesen eines Zeichens nicht so gut geeignet ist.
do {scanf("%c",&Tabellenart);} while (getchar() != '\n')
Tendenziell ist obiger Ansatz ok, wenn auch recht mühsam.
Die Buchstaben müssen einzeln geprüft und in einen Puffer geschrieben werden.
Danach muss eine Umwandlung nach double erfolgen. Bedenke das der Benutzer auch zwei mal nen '.' eingeben kann, Vorzeichen sollten möglich sein und eine Eingabe im Exponentialformat sollte möglich sein, etc. Das ist viel Aufwand!
Statt scanf würde ich in diesem Fall getchar nehmen.
So würde ich aber nur dann vorgehen, wenn es nicht anders ginge.
Ansonsten würde ich die Arbeit scanf, bzw. fgets und strtod überlassen:
int read_double_from_scanf ( double* number )
{
if ( 1 != scanf ("%lf", number) )
{
puts ("ERROR: No double number read!");
return 1;
}
else
{
puts ("OK: Double number read!");
if ( getchar() != '\n' )
{
puts ("Extra character(s) were typed at the end of the input!");
return 1;
}
}
return 0;
}
void rem_lf ( char* buf )
{
char* p = strrchr( buf, '\n' );
if ( p )
*p = 0;
}
int read_double_from_gets ( double* number )
{
char buf[256] = {0};
char* eptr = 0;
fgets ( buf, sizeof(buf), stdin );
rem_lf ( buf );
if ( *buf == 0 )
{
puts ("ERROR: Empty input!");
return 1;
}
strtod ( buf, &eptr );
if ( eptr == buf )
{
puts ("ERROR: No number read!");
return 1;
}
if ( eptr != 0 )
{
puts ("Extra character(s) were typed at the end of the input!");
return 1;
}
return 0;
}
Gruß,
B.B.