Präprozessoranweisungen C
-
Hi,
wollte fragen, wie man in C mit Präprozessoranweisungen z.B. überprüft ob ein eingegebener Wert ein double ist etc. um zu verhindern dass ein Fehler ausgelöst wird.
Habe gerade gelesen, dass es in C keine exceptions gibt deshalb gleich die Frage zu Präprozessoranweisungen.
-
TabyTod schrieb:
Hi,
wollte fragen, wie man in C mit Präprozessoranweisungen z.B. überprüft ob ein eingegebener Wert ein double ist etc. um zu verhindern dass ein Fehler ausgelöst wird.
Habe gerade gelesen, dass es in C keine exceptions gibt deshalb gleich die Frage zu Präprozessoranweisungen.Hä?
Wenn Du den Benutzer eine Zahl in eine double-Variable eingeben läßt, dann ist da ein double. Was willste testen?
-
Gar nicht.
Zur Laufzeit kannst du z.B. assert verwenden, dabei dann aber NDEBUG beachten.TabyTod schrieb:
wollte fragen, wie man in C mit Präprozessoranweisungen z.B. überprüft ob ein eingegebener Wert ein double ist etc. um zu verhindern dass ein Fehler ausgelöst wird.
Sinnvoll ist es eher andersherum: Fehler auslösen, wenn eine Bedingung nicht zutreffend ist.
-
Wenn er eine String eingibt und ich eine Double haben will würde er es allerdings versuchen auf eine double zu speichern und in dem Fall entsteht normalerweise ein Fehler. Oder?
Also ich möchte für den Fall, dass etwas ungültiges eingegeben wird gerne den Fehler abfangen oder ähnliches und eine Meldung ausgeben die den Nutzer darauf hinweist.
-
Wenn du mit scanf ein double einlesen willst, akzeptiert scanf auch nur die Zeichen die zu einem double passen. Und das auch in der richtigen Reihenfolge.
Du kannst zur Laufzeit natürlich überprüfen ob scanf einen Wert gelesen hat.
-
...und wenn ich einen string eingebe hängt sich das Programm auf und stützt ab.
(getestet)
-
Was verstehst du unter String?
"-12.345E+12" ist auch ein String.scanf lässt die Zeichen mit denen es nichts anfangen kann im Eingabestrom stehen.
Du kannst den Rückgabewert von scanf auswerten und die Zeichen bis zum '\n' einlesen: [url]http://www.c-plusplus.net/forum/p1146014#1146014
[/url]
-
Für z.B. scanf musst du natürlich ausreichend Speicher vorgeben, in den der Wert im fehlerfreien Fall eingetragen wird.
Im Fehlerfall liefert scanf einen Rückgabewert, den du auswerten kannst.
Außer scanf ist für genaueres Testen auch strtod geeignet.
-
Blick da jetzt nicht ganz was ich tun soll
benutze normalerweise in java try catchWie müsste denn dieses Programm aussehen wenn es die Fehler abfangen soll?
#include <stdio.h> #include <stdlib.h> double bac( int i, double a, double p, double q ){ if ( i > 0 ) return bac( i - 1, a + p / 100 * a, p - q, q ); return a; } int main(int argc, char *argv[]) { int i; double a, p, q; printf( "Bitte Anzahl der Tage eingeben:\n" ); scanf( "%d", &i ); printf( "Bitte Anzahl der Bakterien eingeben:\n" ); scanf( "%lf", &a ); printf( "Bitte Wachstumsrate eingeben:\n" ); scanf( "%lf", &q ); printf( "Bitte Verminderungsrate eingeben:\n" ); scanf( "%lf", &p ); printf( "Nach %d Tagen sind noch %5.5lf Bakterien am Leben\n", i, bac( i, a, q, p ) ); system( "PAUSE" ); return 0; }
-
so hab jetzt ne Lösung:
#include <stdio.h> #include <stdlib.h> double bac( int i, double a, double p, double q ){ if ( i > 0 ) return bac( i - 1, a + p / 100 * a, p - q, q ); return a; } int main( int argc, char *argv[] ) { int i; double a, p, q; printf( "Bitte Anzahl der Tage eingeben:\n" ); while ( !scanf( "%d", &i ) ) { printf( "Ungültige Eingabe!\n" ); printf( "Bitte Anzahl der Tage eingeben:\n" ); clearerr( stdin ); while ( getc( stdin ) != '\n' ); } printf( "Bitte Anzahl der Bakterien eingeben:\n" ); while ( !scanf( "%lf", &a ) ) { printf( "Ungültige Eingabe!\n" ); printf( "Bitte Anzahl der Bakterien eingeben:\n" ); clearerr( stdin ); while ( getc( stdin ) != '\n' ); } printf( "Bitte Wachstumsrate eingeben:\n" ); scanf( "%lf", &q ); while ( !scanf( "%lf", &q ) ) { printf( "Ungültige Eingabe!\n" ); printf( "Bitte Wachstumsrate eingeben:\n" ); clearerr( stdin ); while ( getc( stdin ) != '\n' ); } printf( "Bitte Verminderungsrate in % eingeben:\n" ); while ( !scanf( "%lf", &p ) ) { printf( "Ungültige Eingabe!\n" ); printf( "Bitte Verminderungsrate in % eingeben:\n" ); clearerr( stdin ); while ( getc( stdin ) != '\n' ); } printf( "Nach %d Tagen sind noch %5.5lf Bakterien am Leben\n", i, bac( i, a, q, p ) ); system( "PAUSE" ); return 0; }