Différence entre scanf () et fgets()

je veux savoir quelle est la différence entre fgets() et scanf() . J'utilise C comme plateforme.

28
demandé sur S.L. Barth 2009-08-10 00:06:11

6 réponses

Il y a plusieurs différences. Deux éléments cruciaux sont:

  • fgets() peut lire à partir de n'importe quel fichier ouvert, mais scanf() ne lit entrée standard.
  • fgets() lit "une ligne de texte" à partir d'un fichier; scanf() peut être utilisé pour cela, mais traite également les conversions de la chaîne à construit en types numériques.

beaucoup de gens vont utiliser fgets() pour lire une ligne de données et ensuite utiliser sscanf() pour le disséquer.

21
répondu Jonathan Leffler 2009-08-09 21:43:07

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 du sujet ici- http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

comment permettez-vous que des espaces soient entrés en utilisant scanf? (C'était mon jumeau maléfique qui se faisait sermonner pour avoir oublié ceci - pas moi)

6
répondu Kelly Gendron 2017-05-23 11:54:28
int scanf(const char * restrict format, ...);

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

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

fgets(3) lit simplement une" ligne 151960920 "du fichier d'entrée stream et copie les octets comme chaîne de terminaison nulle au tampon str et limite la sortie au tampon aux octets donnés dans taille .

5
répondu daniel 2015-12-28 04:09:34

scanf analyse une chaîne de caractères que vous avez lue (ou créée), et fgets lit une ligne à partir d'un fichier ouvert*. Ou voulez-vous dire fscanf?

1
répondu xcramps 2009-08-09 20:23:16

La principale différence réside dans le fait que scanf n'a pas de limite sur le nombre de caractères qui peut être lu (par défaut), tandis que fgets a un nombre maximum de caractères qui peuvent être lus.

voir le prototype des deux fonctions:

char * fgets (char * dest, int size, FILE * stream);

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

vous pouvez voir que le deuxième paramètre de fgets impose de lire à la plus grande taille char.

une autre différence évidente est la valeur de retour: fgets retourner un pointeur à dest sur le succès; scanf retourner le nombre d'entrées avec succès apparié et assigné. Ensuite , la fonction scanf scanne l'entrée au format , et lit l'entrée du flux d'entrée standard stdin , tandis que fgets lit l'entrée 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) ne avoir 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 les fgets lit et retourne jusqu'à \n (inclus), en ajoutant un " 1519120920 " à la fin comme un terminateur de chaîne.

0
répondu Kyrol 2012-01-29 23:30:39

il est à noter que scanf les spécifications de patron permettent des limites de largeur de champ:

scanf( " %80s", mybuffer );

mais, où printf() permet de passer la largeur comme une variable (avec'*'):

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

scanf() ne fonctionne pas. (Il interprète le " * " comme un drapeau pour supprimer/ignorer le champ entièrement. Ce qui veut dire qu'on finit par faire des choses comme ça:

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

et aucun moyen de relier la largeur de champ 40 dans le scanf() avec la largeur de tampon 40 dans la déclaration relative à la largeur de tampon.

0
répondu Joel Rees 2015-02-09 08:40:30