Falscheingaben für float und double abfangen in c



  • Hallo Leute,

    wie auch ich fragen sich sicherlich viele andere Programmieranfänger wie man Falscheingaben nicht nur von int (isdigit()) sondern auch von float und double-eingaben in c abfangen kann. Nach ewigem Forengesurfe, Büchergewälze usw. hab ich herausgefunden das dies in C wohl nur mit Strings kompfortabel funktioniert und mal nen bisle Gehirnschmalz investiert. Das Ergebnis ist eine Funktion die elementweise den String auf Falscheingaben(zugelassen sind nur Vorzeichen, ein Punkt und Zahlen) prüft und solange läuft bis ein gültiger Wert eingegeben wurde. Ich habe so gut es geht versucht die Fehlerauswertung korrekt zu gestalten, die is noch ein bisle hakelig, aber das beeinträchtigt nicht die eigentliche Funktionalität. Zuletzt wird der gültige String mit atof in float oder double, je nach Bedarf umgewandelt und ausgegeben.

    Bin immer gerne offen für Fragen/Verbesserungsvorschläge, vielleicht geht das ganze ja auch einfacher, ich hab aber keine vergleichbare Funktion wie isdigit für int, für float und double gefunden (hab in MS VS 6, Konsole geschrieben).

    Hier wie gesagt eine Möglichkeit:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    void main()
    {
    	char input[500];
    	bool pruef=false;
    	int i=0, j=0, k=0, x=0,y=0, z=0;
    	float intin;
    	do
    	{
    		system("cls");
    		printf("\n\n\n\tBitte Wert eingeben: ");
    		gets(input);
    		k=strlen(input);
    		x=0; y=0; z=0;
    		for(i=0;i<=k;i++)
    		{
    			printf("\nWert %i.Element: %c\n",i,input[i]);
    
    			if(input[i]=='0'||input[i]=='1'||input[i]=='2'||input[i]=='3'||input[i]=='4'||input[i]=='5'||input[i]=='6'||input[i]=='7'||input[i]=='8'||input[i]=='9')
    			{
    				printf("\n\tOK! (Zahl)\n");
    				pruef=true;
    			}
    			else
    			{
    				if(input[i]=='.'&&!(input[0]=='.'))
    				{
    					if(!(x>0))
    					{
    						printf("\n\tOK! (Punkt)\n");
    						pruef=true; //nur zur Verdeutlichung des Sachverhaltes
    					}
    					else
    					{
    						printf("\n\tNICHT OK! (Mehr als ein Punkt)");
    						pruef=false; //nur zur Verdeutlichung des Sachverhaltes
    					}
    					x++;
    				}
    				else if(input[i]=='+'||input[i]=='-')
    				{
    					for(j=1;j<=k;j++)
    					{
    						if(input[j]=='+'||input[j]=='-')
    						{
    							y++;
    						}
    					}
    					if((!(y>0))&&(!(input[1]=='.')))
    					{
    						printf("\n\tOK! (Vorzeichen)\n");
    						pruef=true; //nur zur Verdeutlichung des Sachverhaltes
    					}
    					else
    					{
    						printf("\n\tNICHT OK! (Vorzeichen nicht im 1.Element/Punkt nach Vorzeichen)\n");
    						pruef=false; //nur zur Verdeutlichung des Sachverhaltes
    					}
    				}
    				else if(input[i]=='\0'&&!(input[0]=='\0'))
    				{
    					printf("\n\tOK! (Stringende)\n");
    					pruef=true; //nur zur Verdeutlichung des Sachverhaltes
    				}
    				else
    				{
    					printf("\n\tNICHT OK (Anderes Zeichen oder Punkt im 1. Element)\n");
    					pruef=false; //nur zur Verdeutlichung des Sachverhaltes
    					z++;
    				}
    			}
    		}
    		system("pause");
    		if(x>1||y>0||z>0||input[0]=='.')				//hier eigentliche Bedingungsprüfung für Schleifenende (pruef)
    		{
    			pruef=false;
    		}
    		else if((input[0]=='+'||input[0]=='-')&&(input[1]=='.'))
    		{
    			pruef=false;
    		}
    		else
    		{
    			pruef=true;
    			system("cls");
    			intin=atof(input);
    			printf("\n\n\n\n\n\t\t\tALLES OK\n\n\n\t\t\tFloatwert: %f\n\n\n",intin);
    		}
    	}while(pruef==false);
    }
    

    MFG aus Berlin



  • => Falsches Forum.



  • oh, oops, sorry stimmt 😃 *neuling is* 😃



  • Achla_Alam schrieb:

    Hallo Leute,

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    void main() //int wäre angebrachter
    {
    	char input[500];
    	bool pruef=false;
    	int i=0, j=0, k=0, x=0,y=0, z=0;
    	float intin;
    	do
    	{
    		system("cls");
    		printf("\n\n\n\tBitte Wert eingeben: ");
    		gets(input); //fgets verhindert einen überlauf
    

    MFG aus Berlin

    mal so auf dem ersten blick aber wozu machst du das ?
    wenn du fehler unterbinden willst dann:

    a = scanf(...)

    if(!a)...
    else

    dann machste eine ausgabe dass es eine falscheingabe war

    ansonsten filterst du gleich alles raus mit der forschleife
    dort lässt du 0-9 zu und liest nur einen punkt ein, was genau der benutzer falsch eingibt interessiert ihn wohl nicht, also einfach korrigieren und gut is


Anmelden zum Antworten