Введение
Мы все знакомы с функцией scanf()
. Это основная функция для ввода основной информации от пользователя. Несмотря на то, что scanf()
отлично работает при вводе данных, таких как целые числа, символы, числа с плавающей запятой и т.д., она определенно отстает при вводе строк, содержащих пробелы. Давайте рассмотрим пример,
#include<stdio.h>
int main()
{
char string[10];
printf("Enter the string: ");
scanf("%s", string);
printf("\n %s",string);
return 0;
}
Вывод:

Как мы можем видеть из приведенного выше примера, scanf()
прекращает сканирование, как только встречает пробел или символ новой строки. Это, фактически, делает ввод строк с использованием scanf()
немного неудобным. Это легко можно избежать, используя другие функции ввода, такие как gets()
и fgets()
.
В этой статье мы собираемся узнать, как применять обе функции и сравнивать их между собой.
Функция gets() в C
gets()
– это предопределенная функция в языке C, используемая для считывания строки или текстовой строки. И сохранения входных данных в строковой переменной. Функция завершает чтение, как только она встречает символ новой строки.
Синтаксис:
gets( имя переменной );
Данный код ниже иллюстрирует использование функции gets()
,
#include<stdio.h>
int main()
{
char string[10];
printf("Enter the String: ");
gets(string);
printf("\n%s",string);
return 0;
}
Вывод:

Сравните вывод с использованием функции scanf()
. Теперь ‘Hello World’ рассматривается как единая строка.
Функция fgets() в языке C
Стандартная библиотека C также предоставляет нам еще одну функцию – функцию fgets()
. Эта функция считывает текстовую строку или строку из указанного файла или консоли. Затем она сохраняет ее в соответствующую строковую переменную.
Подобно функции gets()
, fgets также завершает чтение при обнаружении символа перевода строки. Но, в отличие от gets()
, эта функция также останавливается, когда достигнут символ EOF, или если длина строки превышает указанный предел, n-1.
Синтаксис,
fgets(char *str, int n, FILE *stream)
- str – Это переменная, в которой будет сохранена строка
- n – It is the maximum length of the string that should be read
- stream – Это файловый дескриптор, откуда будет считана строка.
К счастью, мы можем читать текстовые строки из файла или стандартного входного потока, используя функцию fgets()
. Давайте посмотрим, как это работает.
1. Чтение из заданного файла с использованием fgets()
Например,
#include<stdio.h>
int main()
{
char string[20];
FILE *fp;
fp=fopen("file.txt","r");
fgets(string,20,fp);
printf("The string is: %s",string);
fclose(fp);
return 0;
}
предположим, что в файле file.txt содержится строка ‘JournalDev fgets() example!’. В этом случае вывод указанного выше кода будет следующим:

2. Чтение из stdin с использованием fgets()
#include<stdio.h>
int main()
{
char string[20];
printf("Enter the string: ");
fgets(string,20,stdin); #input from stdin stream
printf("\nThe string is: %s",string);
return 0;
}
Вывод:

Заключение
Несмотря на то, что обе функции, gets()
и fgets()
, могут использоваться для чтения строковых входов. Основное различие между ними заключается в том, что последняя позволяет пользователю указать размер буфера. Поэтому ее настоятельно рекомендуется использовать вместо функции gets()
.
Функция gets()
не предусматривает случай, если ввод больше размера буфера. В результате этого может произойти засорение памяти. В этом случае функция fgets()
блеснет и предоставит окончательное решение.
Ссылки
Source:
https://www.digitalocean.com/community/tutorials/fgets-and-gets-in-c-programming