scanf
spécification de largeur
Ces informations s'appliquent à l'interprétation des chaînes de format dans la famille scanf
de fonctions, y compris les versions sécurisées telles que scanf_s
. Ces fonctions partent normalement de l'hypothèse que le flux d'entrée est divisé en une séquence de jetons. Les jetons sont séparés par espace blanc (espace, onglet ou nouvelle ligne), ou pour les types numériques, par la fin naturelle d’un type de données numérique, comme indiqué par le premier caractère qui ne peut pas être converti en texte numérique. Toutefois, la spécification de largeur peut servir à provoquer l'arrêt de l'analyse de l'entrée avant la fin naturelle d'un jeton.
La width
spécification se compose de caractères entre le %
spécificateur de champ de type, qui peut inclure un entier positif appelé champ width
et un ou plusieurs caractères indiquant la taille du champ, qui peut également être considéré comme des modificateurs du type du champ, comme une indication indiquant si le type entier est short
ou long
. Ces caractères correspondent au préfixe de taille.
Champ width
Le width
champ est un entier décimal positif qui contrôle le nombre maximal de caractères à lire pour ce champ. Plus que les width
caractères sont convertis et stockés dans le fichier correspondant argument
. Moins de width
caractères peuvent être lus si un caractère blanc ou un caractère qui ne peut pas être converti en fonction du format donné se produit avant width
d’être atteint.
La spécification de largeur est distincte et distincte de l’argument de taille de mémoire tampon requise par les versions sécurisées de ces fonctions (par exemple, , scanf_s
, wscanf_s
etc.). Dans l'exemple suivant, la spécification de largeur correspond à 20, ce qui indique qu'au maximum 20 caractères doivent être lus à partir du flux d'entrée. La longueur de mémoire tampon correspond à 21, ce qui inclut l'espace pour les 20 caractères possibles et le terminateur Null :
char str[21];
scanf_s("%20s", str, 21);
Si le width
champ n’est pas utilisé, scanf_s
tente de lire l’intégralité du jeton dans la chaîne. Si la taille spécifiée n’est pas suffisamment grande pour contenir l’intégralité du jeton, rien n’est écrit dans la chaîne de destination. Si le width
champ est spécifié, les premiers width
caractères du jeton sont écrits dans la chaîne de destination, ainsi que le terminateur Null.
Préfixe de taille
Préfixes facultatifs h
, hh
l
I64
ll
et L
indiquent la taille du argument
(caractère long ou court, à octet unique ou large, en fonction du caractère de type qu’ils modifient). Ces caractères de spécification de format sont utilisés avec les caractères de type dans les 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 avec la norme C. Les caractères de type et leurs significations sont décrits dans la table « Caractères de type pour les fonctions scanf » dans les scanf
caractères de champ de type.
Remarque
Les h
préfixes et L
les extensions l
Microsoft sont utilisés avec des données de type char
.
Préfixes de taille pour scanf
les spécificateurs de type format et wscanf
de format
Pour spécifier | Utilisez le préfixe | Avec le spécificateur de type |
---|---|---|
double |
l |
e , E , f , g ouG |
long double (identique à double ) |
L |
e , E , f , g ouG |
long int |
l |
d , i , o , x ouX |
long unsigned int |
l |
u |
long long |
ll |
d , i , o , x ouX |
short int |
h |
d , i , o , x ouX |
short unsigned int |
h |
u |
char |
hh |
d , i , o , x ouX |
unsigned char |
hh |
u |
int64 |
I64 |
d , i , o , u , x ou X |
Caractère codé sur un octet avec scanf |
h |
c ou C |
Caractère codé sur un octet avec wscanf |
h |
c ou C |
Caractère large avec scanf |
l |
c ou C |
Caractère large avec wscanf |
l |
c ou C |
Chaîne de caractères sur un octet avec scanf |
h |
s ou S |
Chaîne de caractères sur un octet avec wscanf |
h |
s ou S |
Chaîne de caractères large avec scanf |
l |
s ou S |
Chaîne de caractères large avec wscanf |
l |
s ou S |
Les exemples suivants utilisent h
et l
avec scanf_s
des fonctions et wscanf_s
fonctions :
scanf_s("%ls", &x, 2); // Read a wide-character string
wscanf_s(L"%hC", &x, 2); // Read a single-byte character
Si vous utilisez une fonction non sécurisée dans la famille scanf
, omettez le paramètre de taille indiquant la longueur de la mémoire tampon de l'argument précédent.
Lecture de chaînes non délimitées
Pour lire les chaînes non délimitées par des espaces blancs, un ensemble de caractères entre crochets ([ ]
) peut être remplacé par le s
caractère de type (chaîne). L’ensemble de caractères entre crochets est appelé 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 accent circonflexe (^
), l’effet est inversé : le champ d’entrée est lu jusqu’au premier caractère visible dans le reste du jeu de caractères.
Les deux %[a-z]
et %[z-a]
sont interprétés comme équivalents à %[abcde...z]
. Il s’agit d’une extension de fonction courante scanf
, mais n’est pas requise par standard C.
Lecture de chaînes non déterminée
Pour stocker une chaîne sans stocker de 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 c
type indique que l’argument est un pointeur vers un tableau de caractères. Les caractères N suivants sont lus à partir du flux d’entrée à l’emplacement spécifié et aucun caractère Null ('\0') n’est ajouté. Si N n’est pas spécifié, sa valeur par défaut est 1.
Lorsque vous scanf
arrêtez la lecture d’un champ
La fonction scanf
analyse chaque champ d'entrée, caractère par caractère. Il peut arrêter de lire un champ d’entrée particulier avant d’atteindre un caractère d’espace pour l’une des raisons suivantes :
La largeur spécifiée a été atteinte.
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 qu’il est censé correspondre.
Le caractère suivant n'apparaît pas dans un jeu de caractères donné.
Pour une raison quelconque, quand la fonction scanf
arrête de lire un champ d'entrée, le champ d'entrée suivant est censé débuter au premier caractère non lu. Le caractère en conflit, le cas échéant, est considéré comme non lu. Il s’agit du premier caractère du champ d’entrée suivant ou du premier caractère des opérations de lecture suivantes sur le flux d’entrée.
Voir aussi
scanf
, , _scanf_l
wscanf
, ,_wscanf_l
scanf_s
, , _scanf_s_l
wscanf_s
, ,_wscanf_s_l
Champs de spécification de format : scanf
et wscanf
fonctions
scanf
caractères de champ de type