Ich habe eine function
, die nur gültige Eingaben akzeptieren sollte. In diesem Fall wäre ein gültiger Eingang ein integer
Wert größer Null und kleiner UCHAR_MAX
. Im Falle einer ungültigen Eingabe sollte die [ERR] -Meldung in eine neue Zeile geworfen werden. Das Problem hierbei ist, dass, während es funktioniert Weise es sollte durch Zeichen, es funktioniert nicht so, wie es sollte, wenn die Werte außerhalb des definierten Bereichs sind (0 < input < UCHAR_MAX)
. Das bedeutet, wenn die Eingabe etwas wie -42 oder 1337 ist, macht es nach die [ERR] -Meldung eine zusätzliche Zeile und wartet auf eine andere "Eingabe".Warum produziert meine Funktion zusätzliche neue Zeilen?
Warum macht es eine zusätzliche neue Zeile, warten auf ein anderes "Enter", während es von Zeichen funktioniert und wie kann ich dieses Problem überwinden?
int get_int(void)
{
char lsc; // least significant char - stores the last char at scanf()
char correct_input = 'f'; // boolean value to exit the while-loop
int input = 0; // stores the users input
int return_value = 0; // stores the return value of scanf();
while (correct_input == 'f') {
printf("Please enter an unsigend integer value greater zero: ");
return_value = scanf("%d%c", &input, &lsc);
if (return_value == 2 && lsc == '\n' && UCHAR_MAX > input && input > 0)
{
printf("[OK] Valid input.\n");
correct_input = 't';
}
else if (return_value == EOF) {
exit(0);
}
else
{
printf("[ERR] Invalid input!\n");
while(getchar() != '\n'); // flushes the scanf()-buffer
}
}
return input;
}
resultierender Ausgang:
Please enter a unsigend integer value greater zero: foo [ERR] Invalid input! Please enter a unsigend integer value greater zero: 1337 [ERR] Invalid input! Please enter a unsigend integer value greater zero: -42 [ERR] Invalid input! Please enter a unsigend integer value greater zero: 5 [OK] Valid input.
Wie Sie sehen können darüber weitere neue Linien machen, wenn der Wert außerhalb des Bereichs liegt.
Ich bin dankbar für jede Hilfe, Links, Hinweise und Hinweise!
Sie "spülen" auch wenn es nichts zu spülen gibt. Wenn Sie also eine Zahl eingeben, gefolgt von Newline, wartet das Programm auf eine weitere Zeilenschaltung. Ich empfehle 'fgets' und' sscanf' anstelle von 'scanf' – 4386427
Im Falle der' foo' Eingabe wurde keine neue Zeile gelesen, im Falle von '1337' Eingabe hat es. –
Warum brauchen Sie '& lsc' in 'scanf()'? –