Spécification de largeur scanf
Ces informations s'appliquent à l'interprétation des chaînes de format de la famille scanf de fonctions, y compris les versions sécurisées par exemple scanf_s. Ces fonctions normalement supposent que le flux d'entrée est divisé en une séquence de jetons. Les jetons sont séparés par un espace blanc (espace, tabulation, ou saut de ligne) ou, dans le cas des types numériques, par la fin naturelle d'un type de données numérique comme indiqués par le premier caractère qui ne peut pas être converti en type numérique. Toutefois, la spécification de la largeur peut être utilisée pour effectuer l'arrêt de l'analyse de l'entrée avant la fin naturelle d'un jeton.
La spécification de largeur comprend des caractères entre % et le spécificateur de champ de type, qui peuvent inclure un entier positif appelé le champ de largeur et un ou plusieurs caractères qui indiquent la taille du champ, peuvent également être considérés comme modificateurs du type de champ, comme une indication de si le type entier est short ou long. De tels caractères sont pointés comme le préfixe de taille.
Le champ de la largeur
Le champde la largeur est un entier positif décimal contrôlant le nombre maximal de caractères à lire pour ce champ. Pas plus de de largeur caractères ne sont convertis et inscrits sur l' argumentcorrespondant. Moins de largeur caractères peuvent être lus si un caractère d'espace blanc (espace, tabulation, ou saut de ligne) ou un caractère qui ne peut pas être converti selon le format spécifique se produit avant que la largeur soit atteinte.
La spécification de largeur est séparée et distincte de l'argument de taille de mémoire tampon requis par les versions sécurisées de ces fonctions. (c. - à-d., scanf_s, wscanf_s, etc.). Dans l'exemple suivant, la spécification de largeur est 20, indiquant que jusqu'à 20 caractères doivent être lus du flux d'entrée. La longueur de la mémoire tampon est 21, ce qui inclut la place pour les 20 caractères possibles et la marque de fin null :
char str[21];
scanf_s("%20s", str, 21);
Si le champ de largeur n'est pas utilisé, scanf_s essaie de lire le jeton entier dans la chaîne. Si la taille spécifiée n'est pas assez grande pour contenir le jeton entier, rien n'est écrit dans la chaîne de destination. Si le champ de la largeur est spécifié, les premiers caractères de largeur du jeton sont écrits dans la chaîne de destination avec une marque de fin null.
Le préfixe de taille
Les préfixes facultatifs h, l, ll, I64, et L indiquent la taille de l' argument (court ou long, caractère codé sur un octet ou caractère large, selon le type de caractère qu'ils modifient). Ces caractères de spécification de format sont utilisés avec des caractères de type dans des fonctions scanf ou wscanf pour spécifier l'interprétation des arguments comme indiqué dans le tableau suivant. Le préfixe I64 de type est une extension Microsoft et n'est pas compatible ANSI. Les caractères de type et leurs significations sont décrits dans le tableau « Caractères type pour les fonctions scanf » dans Caractères du champ de type scanf.
Notes
Les préfixes h, l, et L sont des extensions Microsoft lorsqu'ils sont utilisés avec des données de type char.
les préfixes de taille pour les spécificateurs de Format-Type scanf et wscanf
Pour spécifier |
Utilisez les préfixes |
Avec le spécificateur de type |
---|---|---|
double |
l |
e, E, f, g, ou G |
long double (identique à double) |
L |
e, E, f, g, ou G |
long int |
l |
d, i, o, x, or X |
int long non signé |
l |
u |
long long |
ll |
d, i, o, x, or X |
short int |
h |
d, i, o, x, or X |
int short non signé |
h |
u |
__int64 |
I64 |
d, i, o, u, x, ou X |
Caractère à un octet avec scanf |
h |
c ou C |
Caractère à un octet avec wscanf |
h |
c or C |
Caractère large avec scanf |
l |
c or C |
Caractère large avec wscanf |
l |
c ou C |
Chaîne de caractère codé sur un octet avec scanf |
h |
s ou S |
Chaîne de caractère codé sur un octet avec wscanf |
h |
s ou S |
Chaîne de caractères larges avec scanf |
l |
s ou S |
Chaîne de caractères larges avec wscanf |
l |
s ou S |
Les exemples suivants utilisent h et l avec des fonctions scanf_s et des fonctions wscanf_s :
scanf_s( "%ls", &x, 2 ); // Read a wide-character string
wscanf_s( "%hC",&x, 2 ); // Read a single-byte character
Si vous utilisez une fonction non sécurisée de la famille scanf, omettez le paramètre de taille qui indique la longueur de la mémoire tampon de l'argument précédent.
Lecture de chaînes non délimitées
Pour lire des chaînes non délimitées par des caractères d'espaces blancs, un jeu de caractères entre crochets ([ ]) peut être remplacé pour le caractère de type s (string). Le jeu de caractères entre crochets est désigné comme une chaîne de contrôle. Le champ d'entrée correspondant est lu jusqu'au premier caractère qui n'apparaît pas dans la chaîne de contrôle. Si le premier caractère du jeu est un signe insertion (^), le résultat est inversé : Le champ d'entrée est lu jusqu'au premier caractère qui apparaît dans le reste du jeu de caractères.
Notez que %[a-z] et %[z-a] sont interprétés comme équivalent à %[abcde...z]. Il s'agit d'une extension de fonction scanf commune, mais notez que l'ANSI ne la requiert pas.
Lire des chaînes non terminées
Pour enregistrer une chaîne sans enregistrer un caractère NULL de fin ("\0 "), utilisez la spécification %nc où n est un entier décimal. Dans ce cas, le caractère de type c indique que l'argument est un pointeur vers un tableau de caractères. Les caractères suivants n sont lus du flux d'entrée dans l'emplacement spécifié, et aucun caractère NULL ("\0 ") n'est ajouté. Si n n'est pas spécifié, la valeur par défaut est 1.
Lorsque le scanf cesse de lire un champ
La fonction scanf analyse chaque champ d'entrée, caractère par caractère. Elle peut cesser de lire un champ d'entrée particulier avant qu'il atteigne un espace pour diverses raisons :
La largeur spécifiée est dépassée.
Le caractère suivant ne peut pas être converti comme spécifié.
Le caractère suivant est en conflit avec un caractère dans la chaîne de contrôle auquel il est supposé correspondre.
Le caractère suivant n'apparaît pas dans un jeu de caractères donné.
Pour quelque raison que ce soit, lorsque la fonction scanf cesse de lire un champ d'entrée, le champ d'entrée suivant est considéré comme commençant au premier caractère non lu. Le caractère incompatible, s'il y en a un, est considéré comme non lu et est le premier caractère du champ d'entrée suivant ou le premier caractère dans les opérations suivantes de lecture sur le flux d'entrée.
Voir aussi
Référence
scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l
Champs de spécification de format : fonctions scanf et wscanf