1
votes

I have a specific example below, which works perfectly fine if integers are inputted (see output1), when I try to scan a char using %d specifier in scanf function call I get the output2 below.

So, my question is if input a char I hope the type specifier should convert it to an equivalent int value, if not a junk value, even in the either case it should print/segfault. But, here I'm getting continuous prints which I feel is wrong as scanf is getting bypassed every single time. I'm pretty unsure what's happening in the background and would like to know the same.

#include <stdio.h>

int main()
{

   int a;

   while (1){
       printf("enter a number:");
       scanf("%d", &a);
       printf("entered number is %d\n", a);
   }

return 0;
}

Output1:

>     enter a number:1
>     entered number is 1
>     enter a number:
>     3
>     entered number is 3
>     enter a number:4
>     entered number is 4
>     enter a number:5
>     entered number is 5 enter a number:

Output2: for input a

>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767
>     enter a number:entered number is 32767

PS: I know this is a stupid question of asking what happens in an invalid case where a type specifier unintended (%d in this case) is used for different type, but I would like to know what happens in the background, if any. Thanks

1
Short story: If the input doesn't match the format then scanf returns early (check what the call returns! always!) leaving the input still in the buffer. - Some programmer dude
In the background (actually in right in front of you, but you ignore it) scanf tells you that it did not successfully read an integer. The return value carries that information. - Yunnosch
"%d" expects numeric input like (white-spaces)(sign)[digits]. If the user does not type that, nothing is read and text remains in stdin for the next input function - With your code, bad input leads to an endless loop as the offending text is never consumed. - chux - Reinstate Monica
%d will not read characters. You will need to use %c for that. - anon
"if input a char" ---> Tip: By "char", I think you mean letters. In C, a char is a type of 1 byte. scanf() does not read char, but characters. Some characters are letters, digits, punctuation, controls, etc. - chux - Reinstate Monica

1 Answers

4
votes

You may check scanf as @Some programmer dude. You may compare the count arguments succesfully filled (Thanks to @chux)

In your case, scanf didn't find any integer value, reached the end of the input and returned EOF, keeping the a variable untouched.

On failure it'll return EOF (read http://www.cplusplus.com/reference/cstdio/scanf/#return).

if(scanf("%d", &a) == 1) //Check if exactly one parameter was read. 
    printf("entered number is %d\n", a);

For characters, you better use getch() or at least, ask for "%c" on scanf:

if(scanf("%c", &a) == 1)
    printf("entered key was %d\n", a);

The "junk" value you recieve is what was in your program memory, because a is not initialized.