Fehleingaben (falscher Datentyp) von 'scanf' abfangen?



  • Guten Abend!

    Ich habe die Aufgabe bekommen, ein kleines Programm zur Zins- und Kapitalentwicklung zu schreiben, was nun im Grunde auch gut funktioniert.

    Hauptaugenmerk liegt allerdings darauf, möglichst alle evtl. vom Benutzer verursachten Fehleingaben abzufangen. Und als Schmankerl ist die Benutzung von Arrays, Pointern und sämtlichen Bibliotheken außer der stdio untersagt! Das Programm muss übrigens unter Linux kompiliert werden, also Windows-spezifische Funktionen scheiden ebenfalls aus.:P

    Zahlenbereiche habe ich bereits so eingeschränkt, dass bei Fehleingabe eine Fehlermeldung erscheint und die Eingabe wiederholt werden muss. Das läuft.

    Mein Problem ist nun aber, wenn der Benuzer anstatt eines erwarteten double-Wertes zum Beispiel einen Buchstaben eintippt. Ergebnis -> Programm tot, Dauerschleife.

    Hier mal eine Funktion, in der mein Problem z.B. auftritt:

    float eingabe_zinssatz (void) {
    
    	float f_zinssatz = 0; // lokale Variable für Zinssatzeingabefunktion
    
    	printf ("\n*********************************************************\n");
    
    	do {
    
    		printf ("\n2.) Bitte geben Sie den gewünschten prozentualen Zinssatz ein!\n");
    		printf ("*** Hinweis: Wertebereich von '0.00' bis '100.00'. ***\n");
    		printf ("\nZinssatz: ");
    		scanf ("%f", &f_zinssatz);
    
    		if (f_zinssatz < MIN_ZINSSATZ || f_zinssatz > MAX_ZINSSATZ) {
    
    			printf ("\n*** EINGABEFEHLER! ***\n");
    
    		} 
    
    	} while (f_zinssatz < MIN_ZINSSATZ || f_zinssatz > MAX_ZINSSATZ);
    
    	return (f_zinssatz);
    
    }
    

    Meine Idee war nun, das Ergebnis der scanf-Eingabe in einer int-Variablen abzuspeichern und diese dann dahingehend zu überprüfen, ob sie den Wert "1" liefert, weil scanf ja die Anzahl der erfolgreich eingelesenen Werte zurückliefert.

    Dies funktioniert leider auch nicht. Hat jemand von Euch eine Idee für dieses Problem bzw. eine allgemeingültige Lösung für verschiedene Datentypen?

    Vielen Dank im Voraus!

    Philipp



  • Entweder mit fgets eine Zeile auslesen und dann mit sscanf die Umwandlung durchführen oder nach dem scanf die Eingabepuffer mit getchar-Schleife leeren, siehe http://c-plusplus.net/forum/viewtopic-var-t-is-39349.html



  • Super, vielen Dank! Der Link war Gold wert, jetzt funktioniert es!



  • just_phil schrieb:

    ...Der Link war Gold wert...

    na dann lass ma n paar gramm rüberwachsen


Log in to reply