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_setc.). 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, hhlI64llet 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 hpréfixes et L les extensions lMicrosoft 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