user3906664
user3906664

Reputation: 13

scanf works before its execution point

I tried a simple program..function returning integer and character pointer..after i run that code i found some weird acting by scanf..I tried to print message(enter a,b:) read two integer inputs and message(enter c,d:) read two char inputs.but at run time..i found that input for the char c is read rightafter i enter the inputs for a,b.. for eg: enter a,b: 10 20 enter c,d: g it gets only one input(for d) and input for c is newline after 20.. for eg 2: enter a,b: 10 20a enter c,d: g it gets only one input(for d) and input for c is a after 20.. why is this happening..please clarify it

 int* add(int *a,int *b)
{
    return (*a>*b?a:b);
}  
char* charret(char *c,char *d)
{
     return (*c>*d?c:d);
 }

int main()
{
    int a,b;
    char c,d;

    printf("\n\t\tFUNCTION RETURNING INTEGER POINTER\n\t");
    printf("Enter the Number A and B:");
    scanf("%d %d",&a,&b);
    printf("\tEnter the character c :");
    scanf("%c %c",&c,&d);
    printf("The Biggestt Value is : %d\n\t",*add(&a,&b));
    printf("\n\tThe character c= %c hi d= %c",c,d);
 //   scanf("%c",&d);
    printf("\n\tThe Biggestt Value is : %c", *charret(&c,&d));
    getch();
    return 0;
}

Upvotes: 1

Views: 218

Answers (2)

wholerabbit
wholerabbit

Reputation: 11567

For most scanf() specifiers, any leading whitespace is skipped. %c is an exception to this, because it reads a single character value, including whitespace characters. Keep in mind when you press Enter, you've sent a '\n' to the input buffer.

scanf("%d %d",&a,&b);

Reads in two numbers. The \n at the end, from pressing Enter, is left in the buffer.

scanf("%c %c",&c,&d);

Reads in two characters, the first of which will be the \n left in the buffer. One way to get around this is:

while (getch() != '\n');

This will eat everything up to an including a newline. You can put that after the scanf() lines you know will leave a newline behind.

Upvotes: 1

FatalError
FatalError

Reputation: 54631

%c will read any character, including the newline character from your previous entry. If you want to read the first non-whitespace character, add a space before %c in your format string:

    scanf(" %c %c",&c,&d);
        /* ^ added space */

This will cause scanf() to eat any number of whitespaces before reading the character.

Upvotes: 6

Related Questions