Проблема с использованием fgets()/gets()/scanf() после scanf() в C
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 . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.