Falscheingaben abfangen für Float und Double 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
-