Sichere Einlesefunktion
-
Hey, ich will eine Einlesefunktion für ganze Zahlen schreiben aber wenn ich eine Kommazahl eingebe kommt eine Endlosschleife
habt ihr ein Trick wie man das umgehen kann?
-
Ein Komma gehört nicht mehr zu einer Ganzzahl.
Wie Buchstaben, Leerzeichen und Sonderzeichen auch.
Da ist halt Schluß, Fertig, Ende. -> return
-
Ein Code wo man einen fehler oder so etwas ähnliches suchen könnte wäre nice.
-
int zahl_einlesen(char *aufforderung, int min, int max) { int zahl = 0; do { printf("%s\n", aufforderung); scanf("%d", &zahl); if (zahl < min || zahl > max) printf("Bitte eine Zahl zwischen %d und %d eingeben.\n", min, max); } while ( zahl < min || zahl > max); return zahl; }
-
Achso, ich dachte, du wolltest die Zahl selber einlesen.
scanf() verarbeitet das Zeichen nicht mehr, das zum Beenden des einlesen geführt hat. Das bleibt im Eingabepuffer. Also liest du es immer wieder ein und führt zum Abbruch. Du musst also erst den Eingabepuffer auslesen.
Du kannst nach dem scanf() folgendes einfügen:
int c; // int c, nicht char c. while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt so
-
ahh okay , da gibts aber auch noch einen anderen Trick ich schau mal nochmal in meine Unterlagen.
-
Dann schau auch mal den Link oben an, ob da nicht dein "Trick" steht und als nicht standardgemäß dargestellt wird.
-
oder was haltet ihr von der Idee das ich die Zahl als Zeichenkette einlesen lasse und sie dann in einen int Wert umwandel. Dann kann man Testen ob die Zeichenkette einen Buchstaben oder Sonderzeichen enthält.
-
Ja, das geht natürlich auch.
-
Mit Wertebereichsprüfung und Eingabepufferlöschung z.B.:
int liesLong(long *l,const char *s) { char *e; errno=0; *l=strtol( s,&e,10 ); if(!*e||*e=='\n') { if(errno!=ERANGE) return 1; } else { int c; while( (c=getchar())!='\n' && c!=EOF ); } return 0; } ... char s[100]; long l; fgets( s,100,stdin ); if( liesLong(&l,s) ) printf("Long: %ld",l); else fputs("Fehler",stderr);
-
oder überprüfen, ob nachher noch was eingegeben wurde:
#include <stdio.h>
#include <stdlib.h>int main()
{
int a;
char c;printf("Welche Augenzahlen sollen eingetragen werden?\n");
scanf("%d%c", &a, &c);if(!(a>=0 && a<=6) || c!='\n'){
printf("falsche eingabe %d%c", a, c);
}
else{
printf("gute eingabe %d", a);//jetzt kannst du hier weitermachen...
}
return 0;
}