this code should read a positive number and if user enter a non-numeric value, it asking him again to enter a number and wait the input to check again till entering a number
do
{
printf("Enter a positive number: ");
}
while ( (scanf("%d%c", &n,&c) != 2 || c!='\n' || n<0) ) ;
but actually when entering non-numeric it keeps doing the body of the while loop without reading the waiting to check the condition of the while loop while(scanf("%d%c", &n,&c) != 2 || c!='\n' || n<0)
when edit the condition to
int clean_stdin()
{
while (getchar()!='\n');
return 1;
}
do
{
printf("Enter a positive number: ");
}
while ( (scanf("%d%c", &n,&c) != 2 || c!='\n' || n<0) && clean_stdin() ) ;
It executes in the right way, but I don't understand why we need to add getchar()
although we already use scanf()
in the condition
When scanf("%d%c", ...
encounters non-numeric input, the "%d"
causes the scanning to stop and the offending character to remain in stdin
for the next input function. The "%c"
does not get a chance to read that non-numeric character.
If code re-reads stdin
with the same scanf("%d%c", ...
, the same result. Some other way is needed to remove the non-numeric input. getchar()
, getch()
, etc. will read any 1 character.