Open In App

Problem With Using fgets()/gets()/scanf() After scanf() in C

Improve
Improve
Like Article
Like
Save
Share
Report

scanf() is a library function in C. It reads standard input from stdin. fgets() is a library function in C. It reads a line from the specified stream and stores it into the string pointed to by the string variable. It only terminates when either:

  • end-of-file is reached
  • n-1 characters are read
  • the newline character is read

1) Consider a below simple program in C. The program reads an integer using scanf(), then reads a string using fgets(),

Input  

10
test

C




// C program to demonstrate the problem when
// fgets()/gets() is used after scanf()
#include <stdio.h>
  
int main()
{
    int x;
    char str[100];
    scanf("%d", &x);
    fgets(str, 100, stdin);
    printf("x = %d, str = %s", x, str);
    return 0;
}


Output

x = 10, str = 

Explanation: The problem with the above code is scanf() reads an integer and leaves a newline character in the buffer. So fgets() only reads newline and the string “test” is ignored by the program.

2) The similar problem occurs when scanf() is used in a loop. 

Input:

a
b
q 

C




// C program to demonstrate the problem when
// scanf() is used in a loop
#include <stdio.h>
  
int main()
{
    char c;
    printf("Press q to quit\n");
    do {
        printf("Enter a character\n");
        scanf("%c", &c);
        printf("%c\n", c);
    } while (c != 'q');
    return 0;
}


Output 

Press q to quit
Enter a character
a
Enter a character


Enter a character
b
Enter a character


Enter a character
q

Explanation: We can notice that the above program prints an extra “Enter a character” followed by an extra newline. This happens because every scanf() leaves a newline character in a buffer that is read by the next scanf.

How to Solve the Above Problem?  

  • We can make scanf() to read a new line by using an extra \n, i.e., scanf(“%d\n”, &x) . In fact scanf(“%d “, &x) also works (Note the extra space).
  • We can add a getchar() after scanf() to read an extra newline.

The corrected programs for the above points will be,

1) scanf() when there is fgets() after it:

Input:

10
test

C




// C program to demonstrate the problem when
// fgets()/gets() is used after scanf()
#include <stdio.h>
  
int main()
{
    int x;
    char str[100];
    scanf("%d\n", &x);
    fgets(str, 100, stdin);
    printf("x = %d, str = %s", x, str);
    return 0;
}


Output

x = 10, str = test

2) When scanf() is used in a loop: 

Input:

a
b
q 

C




// C program to demonstrate the problem when
// scanf() is used in a loop
#include <stdio.h>
  
// Driver Code
int main()
{
    char c;
    printf("Press q to quit\n");
    do {
        printf("Enter a character\n");
        scanf("%c\n", &c);
        printf("%c\n", c);
    } while (c != 'q');
    return 0;
}


Output: Press q to quit

Enter a character
a
Enter a character
b
Enter a character
q

Must Read: Problem occurs with Scanner in Java when nextLine() is used after nextXXX()

 



Last Updated : 04 Jan, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads