Рубрики

Проблема с scanf (), когда после нее стоит fgets () / gets () / scanf ()

Рассмотрим ниже простую программу на C. Программа читает целое число, используя scanf (), затем читает строку, используя fgets ().

// C программа для демонстрации проблемы, когда
// fgets () / gets () используется после 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;

}

вход

10
test

Выход:

x = 10, str =  

Проблема с приведенным выше кодом заключается в том, что scanf () читает целое число и оставляет символ новой строки в буфере. Таким образом, fgets () читает только символ новой строки, а строка «test» игнорируется программой.

Подобная проблема возникает, когда scanf () используется в цикле.

// C программа для демонстрации проблемы, когда
// scanf () используется в цикле
#include<stdio.h>

  

int main()

{

    char c;

    printf("......Enter q to quit......\n");

    do

    {

        printf("Enter a character\n");

        scanf("%c", &c);

        printf("%c\n", c);

    }

    while (c != 'q');

    return 0;

}

вход

a
b
q

Выход:

......Enter q to quit......
Enter a character
a
Enter a character


Enter a character
b
Enter a character


Enter a character
q

Мы можем заметить, что вышеупомянутая программа печатает дополнительный «Введите символ», за которым следует дополнительная новая строка. Это происходит потому, что каждый scanf () оставляет символ новой строки в буфере, который читается следующим scanf.

Как решить вышеуказанную проблему?

  1. Мы можем сделать scanf () для чтения новой строки, используя дополнительный «/ n», то есть scanf («% d / n», & x) . На самом деле scanf («% d», & x) также работает (обратите внимание на дополнительное место).
  2. Мы можем добавить getchar () после scanf (), чтобы прочитать дополнительную новую строку.

Смотрите это и это для исправленных программ.

Та же проблема возникает со Сканером в Java, когда nextLine () используется после nextXXX () .

Эта статья предоставлена Dheeraj Gupta . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Проблема с scanf (), когда после нее стоит fgets () / gets () / scanf ()

0.00 (0%) 0 votes