The following simple program would give an endless loop when the input is a character, though it meant to tell a character from a digit. How to test if scanf
gets a character when it is supposed to be a digit using the return value of scanf
?
#include <stdio.h>
int main() {
int n;
int return_value = 0;
while (!return_value) {
printf("Input a digit:");
return_value = scanf("%d", &n);
}
printf("Your input is %d\n", n);
return 0;
}
As Joachim pointed in his answer that the character doesn't consumed by scanf
here and lives in the buffer, on next iteration scanf
again read the same character and again leave it to the buffer and so on. This results in infinite loop.
You need to consume this character before next iteration. Just place a getchar()
after the line return_value = scanf("%d", &n);
return_value = scanf("%d", &n);
while(getchar() != '\n'); // will consume the charater
You get an infinite loop because scanf
doesn't consume the character, so the character will never leave the input buffer.
You can solve it by reading a line with e.g. fgets
and then use sscanf
on the line.
Add second (nested loop ) loop that clears the input buffer before you try to read from it with another scanf.
I haven't done in a long time but it goes like that:
#include
int main() {
int n;
int return_value = 0;
while (!return_value) {
printf("Input a digit:");
return_value = scanf("%d", &n);
// this loop will "eat" every character that's left in input buffer
while(getchar() !='\n') {
continue;
}
}
printf("Your input is %d\n", n);
return 0;
}
Basically, any function/method that clears the input buffer after fail will work the same way. Choose one you like the most.
You should really use TheDubleM's suggestion and check if buffer
is numeric and if so use atoi on it. In what I put below you will not detect 8f8
as bad input but just read the 8.
#include <stdio.h>
int main() {
int n;
int return_value = 0;
char buffer[1024];
while (!return_value) {
printf("Input a digit:");
scanf("%1024s", buffer);
return_value = sscanf(buffer, "%d", &n);
}
printf("Your input is %d\n", n);
return 0;
}