fgets() e gets() em Programação C

Introdução

Todos nós estamos familiarizados com a função scanf(). É a principal função aplicável para receber entradas básicas do usuário. Mesmo que scanf() funcione bem ao receber entradas como inteiro, caractere, float, etc., ela certamente fica para trás ao receber entradas de strings contendo espaços em branco. Vamos dar uma olhada em um exemplo,

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

Saída:

Problem With scanf()

Como podemos observar no exemplo acima, scanf() para de escanear assim que encontra um espaço em branco ou uma quebra de linha. Isso, de fato, torna um pouco problemático receber entradas de strings usando scanf(). Isso pode ser facilmente evitado usando outras funções de entrada, como gets() e fgets().

Neste artigo, vamos aprender como aplicar ambas as funções e compará-las lado a lado.

Função gets() em C

gets() é uma função predefinida em C usada para ler uma string ou uma linha de texto. E armazena a entrada em uma variável de string bem definida. A função termina sua sessão de leitura assim que encontra um caractere de quebra de linha.

Sintaxe:

gets(nome da variável);

O código fornecido abaixo ilustra o uso da função gets(),

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

Saída:

Use Of Gets

Compare a saída com aquela ao usar a função scanf(). ‘Hello World’ agora é tratado como uma única string.

Função fgets() em C

A biblioteca padrão em C também nos fornece outra função, a função fgets(). A função lê uma linha de texto ou uma string do arquivo ou console especificado. E então a armazena na respectiva variável de string.

Semelhante à função gets(), fgets também encerra a leitura sempre que encontra um caractere de quebra de linha. Mas além disso, ao contrário de gets(), a função também para quando EOF é alcançado ou mesmo se o comprimento da string exceder o limite especificado, n-1.

Sintaxe,

fgets(char *str, int n, FILE *stream)

  • str – É a variável na qual a string será armazenada
  • n – It is the maximum length of the string that should be read
  • stream – É o identificador de arquivo, de onde a string deve ser lida.

Felizmente, podemos ler linhas de texto tanto de um arquivo quanto da entrada padrão usando a função fgets(). Vamos ver como

1. Ler de um arquivo dado usando fgets()

Por exemplo,

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

Considere file.txt contendo a linha ‘Exemplo de fgets() do JournalDev!’. Nesse caso, a saída do código acima seria,

fgets() file input

2. Ler do stdin usando 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;
}

Saída:

fgets() Stdin Input

Conclusão

Mesmo que ambas as funções, gets() e fgets(), possam ser usadas para ler entradas de strings. A maior diferença entre as duas é o fato de que a última permite ao usuário especificar o tamanho do buffer. Portanto, é altamente recomendado sobre a função gets().

A função gets() não tem a provisão para o caso em que a entrada é maior que o buffer. Como resultado, pode ocorrer obstrução de memória. Este é o ponto onde a função fgets() brilha e fornece uma solução definitiva.

Referências

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