fgets() и gets() в программировании на Си

Введение

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

#include<stdio.h>
int main()
{
    char string[10];
    printf("Enter the string: ");
    scanf("%s", string);
    printf("\n %s",string);
    return 0;
}

Вывод:

Problem With scanf()

Как мы можем видеть из приведенного выше примера, 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;
}

Вывод:

Use Of Gets

Сравните вывод с использованием функции 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!’. В этом случае вывод указанного выше кода будет следующим:

fgets() file input

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;
}

Вывод:

fgets() Stdin Input

Заключение

Несмотря на то, что обе функции, gets() и fgets(), могут использоваться для чтения строковых входов. Основное различие между ними заключается в том, что последняя позволяет пользователю указать размер буфера. Поэтому ее настоятельно рекомендуется использовать вместо функции gets().

Функция gets() не предусматривает случай, если ввод больше размера буфера. В результате этого может произойти засорение памяти. В этом случае функция fgets() блеснет и предоставит окончательное решение.

Ссылки

Source:
https://www.digitalocean.com/community/tutorials/fgets-and-gets-in-c-programming