Funktion zur Abfrage von Integer Werten (2 Fehler)



  • Hallo Leute!

    Ich habe eine Funktion geschrieben, die den User einen Integer Wert abfragt. Der Funktion wird ein Text, minimale und maximale Grenze und ein Vorgabewert mitgegeben, falls der Benutzer die Entertaste drückt. Hier die Funktion...

    int getInt(char text[], int min, int max, int vorgabe)
    {
    	char str_eingabe[32];
    	int eingabe;
    	while(1)		// Endlosschleife bis eine richtige Eingabe gemacht wurde
    	{
    		system("cls");
    		printf(text);		// Abfragetext
    		gets(str_eingabe);
    		if(str_eingabe[0]=='\0') return vorgabe;
    		eingabe=atoi(str_eingabe);
    		if(eingabe>=min&&eingabe<=max) return eingabe;
    	}
    }
    

    Dabei sind noch 2 Fehler versteckt...

    1. falls man einen Buchstaben eingibt, erkennt atoi dies als eine 0 und gibt den Wert 0 zurück. (Stattdessen soll die Abfrage wiederholt werden.)

    2. falls ein DAU mehr als 31 Zeichen eingibt wird das Programm möglicherweise abstürzen.

    Kann mir jemand helfen? Vielen Dank im Vorraus.



  • 1. fgets() statt gets()
    2. String mit isalpha() durchgehen und auf "illegale" Character prüfen (hint: bei einer "normalen" Eingabe mit fgets() steht noch ein '\n' im String).
    3. Oder gleich mit strtol() konvertieren, da kann man auch einfache Fehlerchecks mit machen.



  • Hallo Tim!

    Danke für deine schnelle Antwort! Ich hab schon öffter gehört, dass fgets besser sein soll. Warum das so ist weiß ich nicht. Was ich leider auch nicht weiß, ist wie man diese Funktion anwendet. gets ist ganz easy einfach als Parameter ein Charvektor angeben. Wie siehts mit fgets aus? Der erwartet 3 Parameter (Charvektor, integer und komischer Weise noch einen Zeiger auf FILE? 😕

    Hier die aktuelle Funktion...

    int getInt(char text[], int min, int max, int vorgabe)
    {
    	char str_eingabe[32];	// Eingabe als String	
    	int eingabe;			// Eingabe als Integer
    	int fehler;			// Fehlerindikator
    	int i;					// Zählvariable
    	while(1)				// Endlosschleife bis eine richtige Eingabe gemacht wurde
    	{
    		system("cls");
    		printf(text);		// Abfragetext
    		gets(str_eingabe);
    		if(str_eingabe[0]=='\0') return vorgabe;
    		eingabe=atoi(str_eingabe);
    		fehler=0;										// Fehlerindikator wird auf 0 gesetzt
    		for(i=0;str_eingabe[i]=='\0';i++)
    		{
    			if(isalpha(str_eingabe[i])) fehler=1;	// Falls ein Byte einen Buchstaben enthält... Fehler=1
    			if(fehler) break;
    		}
    		if(eingabe>=min&&eingabe<=max&&!(fehler)) return eingabe;
    	}
    }
    

    Mein Fehler: Es soll nicht abggefragt werden ob sich irgendwo ein Buchstabe befindet sondern ob auch jedes Byte eine Zahl ist. (Ein Leerzeichen oder Plus ist genauso nicht erlaubt wie ein Buchstabe.

    isalpha() fragt ja nur einen einzelen Byte ab, ob dieser ein Buchstabe ist. Deshalb brauch ich eine Schleife die den ganzen String ausließt und guckt ob sich irgendwo ein Buchstabe versteckt. Leider geht er nie in die for(i=0;str_eingabe[i]=='\0';i++) Schleife rein.

    Kannst du vielleciht noch einen Satz über strtol sagen? Meine Hilfe funktioniert leider nicht 😞

    Nochmal vielen dank für die Antwort!

    dahaack



  • dahaack schrieb:

    Hallo Tim!

    Danke für deine schnelle Antwort! Ich hab schon öffter gehört, dass fgets besser sein soll. Warum das so ist weiß ich nicht.

    lies deinen Eingangspost durch. Punkt 2 ist die Antwort. gets überprüft nicht, ob es genug Speicher gibt. Mit fgets sagst du, wie viele Bytes maximal gelesen werden dürfen und das ist sicherer, weil du dann (sofern du die richtige Größe angibst), die Speichergrenzen nicht überschreitest.

    //edit:

    Was ich leider auch nicht weiß, ist wie man diese Funktion anwendet. gets ist ganz easy einfach als Parameter ein Charvektor angeben. Wie siehts mit fgets aus?

    RTFM 😉 man: fgets(3)

    Parameter 1: der Pointer zum Buffer, wo die Daten geschrieben werdn
    Parameter 2: Die Länge des Buffers (maximale Anzahl von Zeichen, die gelesen werden dürfen)
    Parameter 3: Dein Stream, von wo du aus Daten lesen willst: z.b. stdin, wenn du von der Tastatur lesen willst.

    // edit2

    man: strtol(3)



  • Hallo!

    Es funktioniert! Vielen dank für eure Hilfe!!!

    int getInt(char text[], int min, int max, int vorgabe)
    {
    	char str_eingabe[33];	// Eingabe als String	
    	int eingabe;			// Eingabe als Integer
    	int fehler;				// Fehlerindikator
    	int i;					// Zählvariable
    	while(1)				// Endlosschleife bis eine richtige Eingabe gemacht wurde
    	{
    		system("cls");
    		printf(text);												// Abfragetext
    		fgets(str_eingabe, 33, stdin);
    		if(str_eingabe[0]==10) return vorgabe;
    		fehler=0;													// Fehlerindikator wird auf 0 gesetzt
    		for(i=0;i<strlen(str_eingabe)-1;i++)
    		{
    			if(!(str_eingabe[i]>=48&&str_eingabe[i]<=57)) fehler=1;	// Falls ein Byte einen Buchstaben enthält... Fehler=1
    			if(fehler) break;
    		}
    		eingabe=atoi(str_eingabe);
    		if(eingabe>=min&&eingabe<=max&&!(fehler)) return eingabe;
    	}
    }
    

Anmelden zum Antworten