web-dev-qa-db-fra.com

Différence entre scanf () et fgets ()

Je veux savoir quelle est la différence entre fgets() et scanf(). J'utilise C comme plate-forme.

29
Biswajyoti Das

Il y a de multiples différences. Les deux plus importants sont:

  • fgets() peut lire à partir de n’importe quel fichier ouvert, mais scanf() lit uniquement les entrées standard.
  • fgets() lit 'une ligne de texte' à partir d'un fichier; scanf() peut être utilisé pour cela, mais gère également les conversions de type chaîne en types numériques intégrés.

De nombreuses personnes vont utiliser fgets() pour lire une ligne de données, puis utiliser sscanf() pour la disséquer.

23
Jonathan Leffler
int scanf(const char * restrict format, ...);

scanf (3) recherche certains pattern définis par l'argument format sur l'entrée donnée appelée stdin, où vous avez défini le modèle. L'entrée donnée dans scanf (3) , selon sa variante (scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf), peut être une chaîne ou un fichier.

char *fgets(char * restrict str, int size, FILE * restrict stream);

fgets (3) lit simplement un line dans le fichier d'entrée stream et copie les octets en tant que chaîne de terminaison nulle dans le tampon str et limite la sortie au tampon à octets dans taille.

6
daniel

Scanf n'effectue pas de vérification des limites. Fgets va probablement être le meilleur choix. Vous pouvez ensuite utiliser sscanf () pour l’évaluer.

Bonne discussion sur le sujet ici- http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

Comment permettez-vous d'entrer des espaces en utilisant scanf? (C'était mon jumeau maléfique se faisant sermonner pour oublier cela- pas moi)

6
Kelly Gendron

scanf analyse une chaîne que vous avez lue (ou créée) et fgets lit une ligne depuis un FILE ouvert *. Ou voulez-vous dire fscanf?

1
xcramps

Il convient de noter que les spécifications de modèle scanf autorisent les limites de largeur de champ:

scanf( " %80s", mybuffer );

Mais, où printf() permet de transmettre la largeur en tant que variable (avec '*'):

printf( "My name is %*s.\n", 20, name );

scanf() ne le fait pas. (Cela interprète le '*' comme un drapeau pour supprimer/ignorer complètement le champ.)

#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );

et aucun moyen de connecter la largeur de champ 40 dans scanf() avec la largeur de mémoire tampon 40 dans la déclaration de mémoire tampon.

1
Joel Rees

La principale différence réside dans le fait que scanf n'a pas de limite quant au nombre de caractères pouvant être lus (dans son utilisation par défaut), alors que fgets a un nombre maximal de caractères pouvant être lus.

Voir le prototype des deux fonctions:

char * fgets (char * dest, taille int, flux * FILE *);

int scanf (format const char *, ...);

Vous pouvez voir que le second paramètre de fgets impose de lire au plus char.

Une autre différence évidente est la valeur de retour: fgets renvoie un pointeur surdesten cas de succès; scanf renvoie le nombre d'éléments d'entrée mis en correspondance et assignés avec succès . Ensuite, la fonction scanf analyse l'entrée en fonction de format et lit les entrées du flux d'entrée standardstdin, tandis que fgets lit les entrées de FILE * stream par défaut.

En conclusion, vous pouvez utiliser scanf pour lire les données d'un fichier et les insérer dans un tableau de taille fixe (par exemple) n'a pas beaucoup de sens . Un avantage de scanf est le formatage des données de sortie: si la fonction lit 12345\n, la sortie est 12345, tandis que le fgets lit et renvoie jusqu'au \n (inclus), en ajoutant un \0 à la fin comme terminateur de chaîne.

0
Kyrol