Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

what happens when you input things like 12ab to scanf("%d",&argu)?

Tags:

c

scanf

I came across this problem when I want to check what I input is number. The scanf function will return 1 if I successfully input a number. So here is what I wrote:

int argu;
while(scanf("%d",&argu)!=1){
    printf("Please input a number!\n");
}

But when I input things like abcd to it, the loop would go forever and not stop for prompt.

I looked it up online and found that it had something to do with the cache and I need to clean it up so scanf can get new data. So I tried fflush but it didn't work.

Then I saw this:

int argu,j;
while(scanf("%d",&argu)!=1){
    printf("Please input a number!\n");
    while((j=getchar())!='\n' && j != '\n');
}

Then when I input things like 'abcd' it worked well and it prompted for my input. But when I input things like '12ab', it wouldn't work again.

So is there a way I can check the input for scanf("%d", &argu) is actually a number and prompt for another input if it isn't?

EDIT:

I saw the answers and solved my problem by using while(*eptr != '\n').

Notice that the fgets function actually reads '\n' into the array and gets doesn't. So be careful.

like image 599
Gnijuohz Avatar asked Jun 21 '12 13:06

Gnijuohz


1 Answers

It's better to read a full line, using fgets(), and then inspecting it, rather than trying to parse "on the fly" from the input stream.

It's easier to ignore non-valid input, that way.

Use fgets() and then just strtol() to convert to a number, it will make it easy to see if there is trailing data after the number.

For instance:

char line[128];

while(fgets(line, sizeof line, stdin) != NULL)
{
   char *eptr = NULL;
   long v = strtol(line, &eptr, 10);
   if(eptr == NULL || !isspace(*eptr))
   {
     printf("Invalid input: %s", line);
     continue;
   }
   /* Put desired processing code here. */
}
like image 76
unwind Avatar answered Sep 30 '22 15:09

unwind