fgets() et gets() en programmation C

Introduction

Nous sommes tous familiers avec la fonction scanf(). C’est la principale fonction applicable pour prendre des entrées utilisateur de base. Même si scanf() fonctionne bien lorsqu’il s’agit de prendre des entrées telles que des entiers, des caractères, des flottants, etc. Il est certainement en retard lorsqu’il s’agit de prendre des entrées de chaîne contenant des espaces blancs. Jetons un coup d’œil à un exemple,

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

Sortie :

Problem With scanf()

Comme nous pouvons l’observer dans l’exemple ci-dessus. scanf() s’arrête de scanner dès qu’il rencontre un espace blanc ou une nouvelle ligne. Cela rend en fait un peu problématique de prendre des entrées de chaîne en utilisant scanf(). Cela peut être facilement évité en utilisant d’autres fonctions d’entrée comme gets() et fgets().

Dans cet article, nous allons apprendre comment appliquer les deux fonctions et les comparer côte à côte.

Fonction gets() en C

gets() est une fonction prédéfinie en C qui est utilisée pour lire une chaîne ou une ligne de texte. Et stocker l’entrée dans une variable de chaîne bien définie. La fonction termine sa session de lecture dès qu’elle rencontre un caractère de nouvelle ligne.

Syntaxe :

gets(nom de la variable);

Le code donné ci-dessous illustre l’utilisation de la fonction gets(),

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

Sortie:

Use Of Gets

Comparez la sortie avec celle obtenue en utilisant la fonction scanf(). ‘Hello World’ est maintenant traité comme une unique chaîne.

Fonction fgets() en C

La bibliothèque standard C nous fournit également une autre fonction, la fonction fgets(). La fonction lit une ligne de texte ou une chaîne depuis le fichier ou la console spécifié. Puis la stocke dans la variable de chaîne respective.

Tout comme la fonction gets(), fgets termine également la lecture lorsqu’elle rencontre un caractère de nouvelle ligne. Mais en outre, contrairement à gets(), la fonction s’arrête également lorsque EOF est atteint ou même si la longueur de la chaîne dépasse la limite spécifiée, n-1.

Syntaxe,

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

  • str – C’est la variable dans laquelle la chaîne va être stockée
  • n – It is the maximum length of the string that should be read
  • stream – C’est le handle de fichier, à partir duquel la chaîne doit être lue.

Heureusement, nous pouvons lire des lignes de texte à partir d’un fichier ou du flux d’entrée standard en utilisant la fonction fgets(). Voyons comment

1. Lire à partir d’un fichier donné en utilisant fgets()

Par exemple,

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

considérez le fichier file.txt contenant la ligne ‘JournalDev fgets() example!’. Dans ce cas, la sortie du code ci-dessus serait,

fgets() file input

2. Lire depuis stdin en utilisant 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;
}

Sortie:

fgets() Stdin Input

Conclusion

Même si les deux fonctions, gets() et fgets(), peuvent être utilisées pour lire des entrées de chaînes. La plus grande différence entre les deux est que la dernière permet à l’utilisateur de spécifier la taille du tampon. Il est donc fortement recommandé par rapport à la fonction gets().

La fonction gets() ne prend pas en compte le cas où l’entrée est plus grande que le tampon. Par conséquent, un engorgement de mémoire peut se produire. C’est là que la fonction fgets() brille et offre une solution ultime.

Références

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