Проблема с использованием fgets()/gets()/scanf() после scanf() в C

Опубликовано: 15 Сентября, 2022

scanf() — это библиотечная функция на C. Она считывает стандартный ввод со стандартного ввода. fgets() — это библиотечная функция в C. Она читает строку из указанного потока и сохраняет ее в строку, на которую указывает строковая переменная. Он прекращается только в том случае, если:

  • достигнут конец файла
  • читаются n-1 символов
  • символ новой строки читается

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

Вход

10
test

Выход

x = 10, str = 

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

2) Аналогичная проблема возникает при использовании scanf() в цикле.

Вход:

a
b
q 

Выход

Press q to quit
Enter a character
a
Enter a character


Enter a character
b
Enter a character


Enter a character
q

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

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

  • Мы можем заставить scanf() читать новую строку, используя дополнительный , т.е. scanf("%d ", &x) . Фактически, scanf("%d ", &x) также работает (обратите внимание на дополнительное пространство).
  • Мы можем добавить getchar() после scanf() , чтобы прочитать дополнительную новую строку.

Исправленные программы по вышеуказанным пунктам будут,

1) scanf(), когда после него идет fgets():

Вход:

10
test

Выход

x = 10, str = test

2) Когда scanf() используется в цикле:

Вход:

a
b
q 

Выход: нажмите q, чтобы выйти

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

Обязательно к прочтению: проблема возникает со сканером в Java, когда nextLine() используется после nextXXX()

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

C