pointeur vers une chaîne de caractères terminée par un caractère nul à lire
format
–
pointeur vers une chaîne de caractères terminée par un caractère nul spécifiant comment lire l’entrée
vlist
–
liste d’arguments variables contenant les arguments récepteurs.
La chaîne format se compose de
caractères multi-octets non blancs sauf % : chaque tel caractère dans la chaîne format consomme exactement un caractère identique du flux d’entrée, ou provoque l’échec de la fonction si le caractère suivant dans le flux n’est pas égal.
caractères blancs : tout caractère blanc simple dans la chaîne format consomme tous les caractères blancs consécutifs disponibles de l’entrée (déterminés comme en appelant std::isspace en boucle). Notez qu’il n’y a pas de différence entre "\n", " ", "\t\t" ou tout autre caractère blanc dans la chaîne format.
spécifications de conversion. Chaque spécification de conversion a le format suivant :
caractère d’introduction %.
(optionnel) caractère de suppression d’affectation *. Si cette option est présente, la fonction n’affecte pas le résultat de la conversion à un argument récepteur.
(optionnel) nombre entier (supérieur à zéro) qui spécifie la largeur de champ maximale, c’est-à-dire le nombre maximal de caractères que la fonction est autorisée à consommer lors de la conversion spécifiée par la spécification de conversion courante. Notez que %s et %[ peuvent mener à un débordement de tampon si la largeur n’est pas fournie.
(optionnel)modificateur de longueur qui spécifie la taille de l’argument récepteur, c’est-à-dire le type de destination réel. Cela affecte la précision de la conversion et les règles de débordement. Le type de destination par défaut est différent pour chaque type de conversion (voir tableau ci-dessous).
spécificateur de format de conversion.
Les spécificateurs de format suivants sont disponibles :
Spécificateur de conversion
Explication
Type d’argument attendu
Modificateur de longueur →
hh
h
aucun
l
ll
j
z
t
L
Disponible seulement depuis C++11 →
Oui
Oui
Oui
Oui
Oui
%
Correspond au littéral %.
N/A
N/A
N/A
N/A
N/A
N/A
N/A
N/A
N/A
c
Correspond à un caractère ou à une séquence de caractères.
Si un spécificateur de largeur est utilisé, correspond exactement à largeur caractères (l’argument doit être un pointeur vers un tableau avec une capacité suffisante).
Contrairement à %s et %[, n’ajoute pas le caractère nul à la fin du tableau.
N/A
N/A
char*
wchar_t*
N/A
N/A
N/A
N/A
N/A
s
Correspond à une séquence de caractères non blancs (une chaîne).
Si un spécificateur de largeur est utilisé, correspond jusqu’à largeur ou jusqu’au premier caractère blanc, selon ce qui apparaît en premier.
Stocke toujours un caractère nul en plus des caractères correspondants (donc le tableau de l’argument doit avoir de la place pour au moins largeur+1 caractères).
[set ]
Correspond à une séquence non vide de caractères de l’ensemble de caractères.
Si le premier caractère de l’ensemble est ^, alors tous les caractères qui ne sont pas dans l’ensemble sont mis en correspondance.
Si l’ensemble commence par ] ou ^] alors le caractère ] est également inclus dans l’ensemble.
La norme laisse la définition au compilateur de savoir si le caractère - en position non initiale dans le jeu de balayage peut indiquer un intervalle, comme dans [0-9].
Si un spécificateur de largeur est utilisé, correspond seulement jusqu’à largeur.
Stocke toujours un caractère nul en plus des caractères correspondants (donc le tableau de l’argument doit avoir de la place pour au moins largeur+1 caractères).
d
Correspond à un entier décimal.
Le format du nombre est le même que celui attendu par std::strtol avec la valeur 10 pour l’argument base.
signedchar* ou unsignedchar*
signedshort* ou unsignedshort*
signedint* ou unsignedint*
signedlong* ou unsignedlong*
signedlonglong* ou unsignedlonglong*
std::intmax_t* ou std::uintmax_t*
std::size_t*
std::ptrdiff_t*
N/A
b(C++26)
Correspond à un entier binaire non signé.
Le format du nombre est le même que celui attendu par std::strtoul avec la valeur 2 pour l’argument base.
i
Correspond à un entier.
Le format du nombre est le même que celui attendu par std::strtol avec la valeur 0 pour l’argument base (la base est déterminée par les premiers caractères analysés).
u
Correspond à un entier décimal non signé.
Le format du nombre est le même que celui attendu par std::strtoul avec la valeur 10 pour l’argument base.
o
Correspond à un entier octal non signé.
Le format du nombre est le même que celui attendu par std::strtoul avec la valeur 8 pour l’argument base.
x X
Correspond à un entier hexadécimal non signé.
Le format du nombre est le même que celui attendu par std::strtoul avec la valeur 16 pour l’argument base.
n
Retourne le nombre de caractères lus jusqu’à présent.
Aucune entrée n’est consommée. N’incrémente pas le compteur d’affectations.
Si le spécificateur a un opérateur de suppression d’affectation défini, le comportement est indéfini.
a(C++11) A(C++11) e E f F(C++11) g G
Correspond à un nombre à virgule flottante.
Le format du nombre est le même que celui attendu par std::strtof.
N/A
N/A
float*
double*
N/A
N/A
N/A
N/A
longdouble*
p
Correspond à une séquence de caractères définie par l’implémentation représentant un pointeur.
printfLes fonctions de la famille %p doivent produire la même séquence en utilisant le spécificateur de format
.
N/A
void**
N/A
N/A
N/A
N/A
N/A
N/A
Remarques
Pour tout spécificateur de conversion autre que n, la plus longue séquence de caractères d’entrée qui ne dépasse aucune largeur de champ spécifiée et qui est soit exactement ce qu’attend le spécificateur de conversion, soit un préfixe d’une séquence qu’il attendrait, est ce qui est consommé depuis le flux. Le premier caractère, s’il y en a un, après cette séquence consommée reste non lu. Si la séquence consommée a une longueur nulle ou si elle ne peut pas être convertie comme spécifié ci-dessus, l’échec de correspondance se produit, sauf si une fin de fichier, une erreur d’encodage ou une erreur de lecture a empêché l’entrée depuis le flux, auquel cas il s’agit d’un échec d’entrée.
À l’exception du spécificateur %, l’élément d’entrée (ou, pour %n, le nombre de caractères d’entrée) est d’abord converti en un type approprié au spécificateur de conversion. Sauf si l’affectation a été supprimée avec *, le résultat de la conversion est écrit dans l’objet pointé par l’argument suivant qui n’a pas encore été écrit. Si cet objet n’a pas un type approprié, ou si le résultat de la conversion ne peut pas être représenté dans l’objet, le comportement est indéfini.
Tous les spécificateurs de conversion autres que [, c, et n consomment et ignorent tous les caractères blancs de début (déterminés comme en appelant std::isspace) avant de tenter d’analyser l’entrée. Ces caractères consommés ne comptent pas dans la largeur de champ maximale spécifiée.
Les spécificateurs de conversion lc, ls, et l[ effectuent une conversion multi-octets en caractère large comme en appelant std::mbrtowc avec un objet std::mbstate_t initialisé à zéro avant la conversion du premier caractère.
Les spécificateurs de conversion s et [ stockent toujours le terminateur nul en plus des caractères correspondants. La taille du tableau de destination doit être au moins supérieure d’un à la largeur de champ spécifiée. L’utilisation de %s ou %[, sans spécifier la taille du tableau de destination, est aussi dangereuse que std::gets.
Il y a un point de séquence après l’action de chaque spécificateur de conversion ; cela permet de stocker plusieurs champs dans la même variable « réceptacle ».
Lors de l’analyse d’une valeur à virgule flottante incomplète qui se termine par l’exposant sans chiffres, comme l’analyse de "100er" avec le spécificateur de conversion %f, la séquence "100e" (le plus long préfixe d’un nombre à virgule flottante potentiellement valide) est consommée, ce qui entraîne une erreur de correspondance (la séquence consommée ne peut pas être convertie en nombre à virgule flottante), avec "r" restant. Certaines implémentations existantes ne suivent pas cette règle et reviennent en arrière pour ne consommer que "100", laissant "er", par exemple bogue glibc 1765.
Si une spécification de conversion est invalide, le comportement est indéfini.
Valeur de retour
Nombre d'arguments lus avec succès, ou
EOF
en cas d'échec.
Notes
Toutes ces fonctions invoquent
va_arg
au moins une fois, la valeur de
arg
est indéterminée après le retour. Ces fonctions n'invoquent pas
va_end
, et cela doit être effectué par l'appelant.