Différence entre scanf () et fgets()
6 réponses
Il y a plusieurs différences. Deux éléments cruciaux sont:
-
fgets()
peut lire à partir de n'importe quel fichier ouvert, maisscanf()
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.
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)
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 .
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?
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.
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.