2009-08-09 9 views

Répondre

6

Scanf n'effectue pas de vérification des limites. fgets est susceptible d'ê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

How do you allow spaces to be entered using scanf? (C'était mon jumeau maléfique se a donné des conférences pour oublier this- pas moi)

+1

Pour les types numériques, scanf() n'a pas besoin de vérifier les limites. Pour les types de chaînes, vous pouvez indiquer à scanf() de faire une vérification des limites. –

1

scanf contenant une chaîne que vous lisez (ou créé), et fgets lit une ligne à partir d'un FICHIER ouvert *. Ou voulez-vous dire fscanf?

+1

vous pouvez lire à partir de l'entrée standard (console) avec fgets. –

20

Il existe plusieurs différences. Deux d'entre elles sont cruciales:

  • fgets() peut lire de tout fichier ouvert, mais scanf() ne lit que l'entrée standard. Lit une «ligne de texte» à partir d'un fichier; scanf() peut être utilisé pour cela mais gère également les conversions de chaîne en types numériques intégrés.

Beaucoup de gens vont utiliser fgets() pour lire une ligne de données, puis utiliser sscanf() pour disséquer.

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

scanf (3) recherches pour certains motif défini par l'argument de format sur l'entrée donnée connue sous le nom stdin, où le motif est défini par vous. L'entrée donnée à scanf (3), en fonction de 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 simple ligne à partir du fichier d'entrée de flux et de copier les octets de chaîne de terminaison comme nulle au tampon str et limiter la sortie de la mémoire tampon d'octets donnés en taille.

0

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

Voir le prototype des deux fonctions:

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

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

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

Une autre différence nette est la valeur de retour: fgets retour un pointeur vers dest sur le succès; scanf renvoie le nombre d'éléments d'entrée mis en correspondance et attribués avec succès. Ensuite, la fonction scanf balaye entrée selon le format et lit l'entrée du flux d'entrée standard stdin, alors que fgets lit entrée de FILE * flux 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 les fgets lisent et retournent jusqu'à \n (inclus), en ajoutant un \0 à la fin comme une terminaison de chaîne.

0

Il convient de noter que scanf caractéristiques de modèle ne permettent limites de largeur de champ:

scanf(" %80s", mybuffer); 

Mais où printf() permet la largeur à passer comme une variable (avec « * »):

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

scanf() ne fait pas. (Il interprète le « * » comme un drapeau pour supprimer/ignorer le champ tout à fait.) Ce qui signifie que vous finissez par faire des choses comme ceci:

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

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

Questions connexes