Integer-Wert einlesen
-
Habe hier eine Funktion namens reaint und wie der Name shcon sagt soll sie Interger Werte mit Fehlerbehandlung einlesen. EInen Fehler konnte ich noch nicht ausmerzen und zwar, das wenn man z.b. 3x eingibt, er einfach mit der 3 weitermacht. Das muss ich noch irgendwie wegbekommen. Hier die Funktion:
int readint(const char msg[], int lower, int upper) { enum{FALSE,TRUE}; int flag, n, read; read = TRUE; while (read) { printf("\n%s",msg); n = scanf("%i", &flag); while (getchar() != '\n') ; if (n != 1) { printf("\nUngueltige Eingabe! Bitte einen Zahlenwert zwischen %i und %i eingeben!", lower, upper); } else if (flag < lower || flag > upper) { printf("\nBitte Wert zwischen %i und %i eingeben", lower, upper); } else read = FALSE; } return flag; }
-
liegt am scanf.
guck dir strtoi oder strtof an. die melden den rest des strings zurueck.
-
Dürfen wir nicht benutzen. Gibt es eine andere Möglichkeit?
-
ja, komplett selber parsen.
-
Wie geht das ?
-
ganz "einfach":
whitespace ueberspringen oder nicht, ganz wie du willst.
gibts ein + oder -, ist das das vorzeichen.
eine folge von zeichen im bereich von 0 bis 9 lesen und zur zahl machen.
ist der string zuende, wars das schon; ansonsten musst du entscheiden, ob ein " -12 EUR" eine zahl ist oder nicht.das ist "ziffernfolge in zahl verwandeln":
char *foo = "12345", *p; int x = 0; for(p = foo; *p; ++p) x = x*10 + (*p - '0'); // aktuelle zahl nach links verschieben und neue ziffer dazu
x ist dann:
0
010 + 1
110 + 2
1210 + 3
12310 + 4
1234*10 + 5
12345
-
Dieses Problemm wurde vor kurzem hier besprochen.
Eine Lösung ist wie schon erwähnt, selber parsen.
Die andere Lösung, etwas primitiv aber hier sehr effizient, schauen ob sich noch irgendwelche Zeichen im stdin befinden:/*Zahleinlesen*/ n = scanf("%d",&number); /*Überprüfenob das nächste Zeichen im stdin */ /*Zeilenende ist, sonst war die Eingabe falsch*/ if (getchar() != '\n') { /*Hier muss bei einer falschen Eingabe was getan werden */ }