Partager via


spécification de la largeur de scanf

Ces informations s'appliquent à la traduction des chaînes de format de la famille d' scanf des fonctions, notamment les versions sécurisées telles que scanf_s.Ces fonctions supposent normalement 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, onglet, ou saut de ligne), ou dans le cas de les types numériques, par l'extrémité 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 être utilisée pour effectuer pour arrêter l'analyse de l'entrée avant la fin naturelle d'un jeton.

La spécification de largeur est constituée de caractères entre % et le spécificateur de champ de type, qui peuvent inclure un entier positif appelé champ de largeur et un ou plusieurs caractères indiquant la taille du champ, peut également être considéré comme modificateurs du type du champ, tel que dont une indication si le type est short ou long.De tels caractères s'appelle le préfixe de taille.

Le champ de largeur

Le champde largeur est un entier décimal positif du nombre maximal de caractères à lire pour ce champ.Pas plus que des caractères de largeur sont convertis et stockés dans argumentcorrespondant.Moins de les caractères de largeur peuvent être lus si un caractère d'espace blanc (espace, onglet, ou saut de ligne) ou un caractère qui ne peuvent pas être convertis selon le format donné se produit avant que la largeur soit atteinte.

La spécification de largeur est séparée et séparée de l'argument taille de la mémoire tampon requis par les versions sécurisées de ces fonctions (c. autrement dit., 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, qui inclut la place pour les 20 caractères possibles plus le terminateur 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 d'entier dans la chaîne.Si la taille spécifiée n'est pas suffisamment grande pour contenir le jeton entier, rien ne sera écrit dans la chaîne de destination.Si le champ de largeur est spécifié, les premiers caractères de largeur dans le jeton seront envoyés à la chaîne de destination avec le terminateur null.

Le préfixe de taille

Les préfixes facultatifs h, l, ll, I64, et l indiquent la taille d' argument (long ou court, caractère codé sur un octet ou caractères larges, en fonction de le caractère de type qu'il modifie).Ces caractères de spécification de format sont utilisés avec les caractères de type dans scanf ou wscanf fonctionne pour spécifier la traduction des arguments comme indiqué dans le tableau suivant.le préfixe I64 de type est une extension Microsoft et n'est pas ANSI compatible.Les caractères de type et leurs significations sont décrits dans « caractères de type la table pour de scanf fonctions » dans type de caractères scanf de champ.

[!REMARQUE]

h, l, et les préfixes de l sont des extensions Microsoft lorsqu'ils sont utilisés avec des données de type char.

Redimensionnez les préfixes pour les spécificateurs de Format-Type de scanf et de wscanf

Pour spécifier

préfixe d'utilisation

avec le spécificateur de type

double

l

e, e, f, g, ou G

long double (même que le double)

L

e, e, f, g, ou G

long int

l

d, i, o, X, ou X

long entier non signé

l

u

pendant longtemps

ll

d, i, o, X, ou X

short int

h

d, i, o, X, ou X

unsigned int abrégée

h

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 élargi avec scanf

l

c ou C

Caractère élargi avec wscanf

l

c, ou C

Chaîne de caractères codés sur un seul octet avec scanf

h

s ou s

Chaîne de caractères codés sur un seul octet avec wscanf

h

s ou s

chaîne à caractères larges avec scanf

l

s ou s

chaîne à caractères larges avec wscanf

l

s ou s

Les exemples suivants utilisent h et l avec les fonctions d' scanf_s et des fonctions d' 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 unsecure dans la famille d' scanf , omettez le paramètre de taille indiquant la longueur de la mémoire tampon de l'argument précédent.

chaînes d'Undelimited de lecture

Pour lire des chaînes non délimitées par des caractères d'espace blanc, un jeu de caractères entre parenthèses ([]) peut être substitué au caractère de type de s (chaîne).Le jeu de caractères entre parenthèses s'agit d'une chaîne de contrôle.Le champ d'entrée correspondant est lu jusqu ' à le premier caractère qui n'apparaît pas dans la chaîne de contrôle.Si le premier caractère dans le jeu est un signe insertion (^), l'effet est inversé : Le champ d'entrée est lu jusqu ' à le premier caractère qui apparaît dans le reste du jeu de caractères.

Notez que % [a-z] et % z-a [] sont interprètes comme équivalent à % [abcde… z].Il s'agit d'une extension courante de fonction d' scanf , mais notez que la norme ANSI ne le requiert pas.

lire les chaînes Unterminated

Pour stocker une chaîne sans enregistrer un caractère NULL de fin (" \ 0 "), utilisez la spécification %ncn est un entier décimal.Dans ce cas, le caractère C indique que l'argument est un pointeur vers un tableau de caractères.Les caractères suivants de n sont lus à partir de le 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é, sa valeur par défaut est 1.

Lorsque scanf arrête de lire un champ

La fonction d' scanf analyse chaque champ d'entrée, caractère par caractère.Il peut cesser de la lecture d'un champ d'entrée particulier avant d'atteindre un espace pour diverses raisons :

  • 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 de la chaîne de contrôle qu'il est censé le 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 de scanf arrête de la lecture d'un champ d'entrée, le champ d'entrée suivant est considéré comme commencer au premier caractère non lu.Le caractère contradictoire, le cas échéant, est considéré comme étant non lu et est le premier caractère du champ d'entrée suivant ou le premier caractère dans les opérations suivantes en lecture du 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 de scanf et de wscanf

type de caractères scanf de champ