13

the program doesnt stop on scanf("%c", &ch) line. why does it happens sombody can please explain this to me

#include<stdlib.h>
#include<stdio.h>

struct list {
   char val;
   struct list * next;
};

typedef struct list item;

void main()
{
    char ch;
    int num;

    printf("Enter [1] if you want to use linked list or [2] for realloc\n");  
    scanf("%d", &num);
    if(num == 2)
    {
        scanf("%c", &ch); 
        printf("%c", ch);
    }
}
haccks
  • 104,019
  • 25
  • 176
  • 264
Aviram Shiri
  • 173
  • 1
  • 2
  • 9
  • 2
    Basically, while just about every other format specifier for `scanf` strips leading whitespace, `%c` is the oddball. You have to treat it very gingerly. – Andon M. Coleman Nov 30 '13 at 23:08

2 Answers2

21

Let's say you input 2 when you're reading for num. The actual input stream will be 2\n (\n is the newline character). 2 goes into the num, and there remains \n, which goes into ch. To avoid this, add a whitespace in format specifier.

scanf(" %c", &ch); 

This will ignore any whitespaces, newlines or tabs.

Paul92
  • 8,827
  • 1
  • 23
  • 37
9

The reason behind this is the newline \n character left behind by previous scanf, when pressing Enter key, for the next read of scanf. When the statement

scanf("%c", &ch);   

executed then it reads that \n left behind by the previous scanf.
To eat up this \n you can use a space before %c specifier. A space before the %c specifier is able to eat up any number of white-space characters.

scanf(" %c", &ch);   
       ^ a space
haccks
  • 104,019
  • 25
  • 176
  • 264