fgets() e gets() na Programação em 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. 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 nova linha. Isso, na verdade, 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 pré-definida em C que é usada para ler uma string ou uma linha de texto. E armazenar 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 nova 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 a obtida ao usar scanf(). ‘Hello World’ agora é tratado como uma única string.

Função fgets() em C

A biblioteca padrão de C também nos fornece mais uma 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.

Similar à função gets(), fgets também termina a leitura sempre que encontra um caractere de nova 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 do arquivo, de onde a string deve ser lida.

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

1. Leia 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 arquivo.txt para conter a linha ‘Exemplo fgets() do JournalDev!’. Nesse caso, a saída do código acima seria,

fgets() file input

2. Leia 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 que o usuário especifique o tamanho do buffer. Portanto, é altamente recomendada sobre a função gets().

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

Referências

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