SCANF(3) | Manuel du programmeur Linux | SCANF(3) |
scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf - Entrées formatées
#include <stdio.h>
int scanf(const char *format, ...); int fscanf(FILE *flux, const char *format, ...); int sscanf(const char *chaîne, const char *format, ...); #include <stdarg.h>
int vscanf(const char *format, va_list ap); int vsscanf(const char *chaîne, const char *format, va_list ap); int vfscanf(FILE *flux, const char *format, va_list ap);
vscanf(), vsscanf(), vfscanf() :
Les fonctions de la famille scanf() analysent leurs entrées conformément au format décrit plus bas. Ce format peut contenir des indicateurs de conversion. Les résultats des conversions, s'il y en a, sont stockés dans des endroits pointés par des arguments pointeurs qui suivent le format. Chaque argument pointeur doit être du type approprié pour la valeur retournée par la spécification de conversion correspondante.
Si le nombre de spécifications de conversion dans format excède le nombre d'arguments pointeur, le résultat est indéterminé. Si le nombre d'arguments pointeur excède le nombre de spécifications de conversion, les arguments pointeur en excès sont évalués mais ignorés.
La fonction scanf() lit ses données depuis le flux d'entrée standard stdin, fscanf() lit ses entrées depuis le flux pointé par flux, et sscanf() lit ses entrées dans la chaîne de caractères pointée par chaîne.
La fonction vfscanf() est analogue à vfprintf(3) et lit ses arguments depuis le flux pointé par flux en utilisant une liste variable d'arguments pointeurs, consultez stdarg(3). La fonction vscanf() examine l'entrée standard en utilisant une liste variable d'arguments pointeurs et la fonction vsscanf() examine une chaîne. Elles sont respectivement analogues aux fonctions vprintf(3) et vsprintf(3).
La chaîne format consiste en une séquence de directives qui décrit comment traiter la séquence des caractères d'entrée. Si le traitement des directives échoue, aucune autre entrée n'est lue et scanf() renvoie. Un « échec » peut être soit un échec d'entrée signifiant que les caractères d'entrée ne sont pas disponibles, soit un échec de correspondance signifiant que l'entrée n'est pas appropriée (voir plus loin).
Une directive peut être :
Chaque spécification de conversion dans format commence soit avec le caractère « % », soit avec la séquence de caractères « %n$ » (voir plus loin pour la distinction) suivie par :
Les spécifications de conversion dans format sont de deux formes : soit elles commencent par « % », soit elles commencent par « %n$ ». Les deux formes ne doivent pas être mélangées dans la même chaîne format, excepté qu'une chaîne contenant les spécifications « %n$ » peut inclure %% et %*. Si format contient des spécifications « % », celles-ci correspondent, dans l'ordre, aux arguments pointeur successifs. Dans la forme « %n$ » (qui est spécifiée par POSIX.1-2001 mais pas par C99), n est un entier décimal qui spécifie que l'entrée convertie devrait être placée à l'endroit référencé par le n-ième argument pointeur suivant format.
Les caractères modificateurs de type suivant peuvent se apparaître dans une spécification de conversion :
Les spécificateurs de conversion suivant sont disponibles :
En cas de succès, ces fonctions renvoient le nombre d'éléments d'entrées correctement mis en correspondance et affectés. Ce nombre peut être plus petit que le nombre d'éléments attendus, et même être nul, dans le cas d'une erreur précoce de mise en correspondance.
La valeur EOF est renvoyée si la fin de l'entrée est atteinte avant la première conversion réussie ou si un échec de correspondance survient. EOF est également renvoyé si une erreur de lecture survient, auquel cas l'indicateur d'erreur pour le flux (consultez ferror(3)) est positionné et errno est remplie en conséquence
Pour une explication des termes utilisés dans cette section, consulter attributes(7).
Interface | Attribut | Valeur |
scanf(), fscanf(), sscanf(), vscanf(), vsscanf(), vfscanf() | Sécurité des threads | MT-Safe locale |
Les fonctions fscanf(), scanf(), et sscanf() sont conformes à C89, C99 et POSIX.1-2001. Ces normes ne spécifient pas l'erreur ERANGE.
Le spécificateur q est une notation BSD 4.4 pour long long, alors que ll ou l'utilisation de L dans les conversions entières sont des notations GNU.
Les versions Linux de ces fonctions sont basées sur la bibliothèque libio GNU. Jetez un œil sur la documentation info de la libc GNU (glibc-1.08) pour une description complète.
Initialement, la bibliothèque C de GNU prenait en charge l'allocation dynamique des chaînes de caractères en entrée (comme une extension non standard) au moyen du caractère a (cette fonctionnalité remonte au moins à la version 2.0 de la glibc). Ainsi, il était possible, grâce au code suivant, de faire que scanf() alloue un tampon pour une chaîne en entrée, et renvoie un pointeur vers ce tampon dans *buf:
char *buf;
scanf("%as", &buf);
L'utilisation de la lettre a dans ce but posait problème étant donné que a est également synonyme de f dans le standard ISO C (entrée de nombre à virgule flottante). POSIX.1-2008 spécifie en revanche que le modificateur m doit être utilisée pour l'affectation allocation (comme indiqué dans la DESCRIPTION plus haut).
Notez que le modificateur a n'est pas disponible si le programme a été compilé avec gcc -std=c99 ou gcc -D_ISOC99_SOURCE (à moins que _GNU_SOURCE n'ait également été indiqué), auquel cas a est interprété comme un spécificateur de nombres en virgule flottante (voir plus haut).
Le modificateur m est pris en charge depuis la version 2.7 de la glibc et les nouveaux programmes doivent utiliser ce modificateur plutôt que a.
En plus d'être un standard de POSIX, le modificateur m présente les avantages suivants par rapport au modificateur a :
Toutes ces fonctions sont totalement conformes à C89, mais lui ajoutent les spécificateurs q et a ainsi que les comportements supplémentaires des spécificateurs L et l. Ce derniers doivent être considérés comme des bogues, car ils modifient le comportement de spécificateurs définis dans C89.
Certaines combinaisons de modificateurs de type et de spécificateurs de conversion définis par le C ANSI n'ont pas de sens (par exemple %Ld). Bien qu'elles aient un comportement bien défini sous Linux, ce n'est peut être pas le cas sur d'autres architectures. Il vaut donc mieux n'utiliser que des modificateurs définis en C ANSI, c'est-à-dire, utilisez q à la place de L avec les conversions d, i, o, u, x et X ou ll.
L'utilisation q n'est pas la même sous BSD 4.4, car il peut être utilisé avec des conversions de réels de manière équivalente à L. [NDT] La conversion %s devrait toujours être accompagnée d'une longueur maximale de chaîne de caractères. En effet, il existe un risque de débordement de tampon, qui peut conduire à un trou de sécurité important dans un programme setuid ou setgid.
Pour utiliser l'indicateur de conversion d'allocation dynamique, indiquez m comme modificateur de longueur (par conséquent %ms ou %m[range]). L'appelant doit libérer (free(3)) l'espace occupé par la chaîne renvoyée, comme dans l'exemple suivant :
char *p; int n; errno = 0; n = scanf("%m[a-z]", &p); if (n == 1) {
printf("read: %s\n", p);
free(p); } else if (errno != 0) {
perror("scanf"); } else {
fprintf(stderr, "Pas de caractères correspondants\n"); }
Comme montré dans cet exemple, il n'est nécessaire d'appeler free(3) que si l'appel à scanf() a réussi à lire une chaîne.
getc(3), printf(3), setlocale(3), strtod(3), strtol(3), strtoul(3)
Cette page fait partie de la publication 5.10 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Frédéric Hantrais <fhantrais@gmail.com> et Grégoire Scano <gregoire.scano@malloc.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.
13 août 2020 | GNU |