vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s
|
Défini dans l'en-tête
<stdio.h>
|
||
| (1) | ||
|
int
vprintf
(
const
char
*
format, va_list vlist
)
;
|
(jusqu'à C99) | |
|
int
vprintf
(
const
char
*
restrict
format, va_list vlist
)
;
|
(depuis C99) | |
| (2) | ||
|
int
vfprintf
(
FILE
*
stream,
const
char
*
format, va_list vlist
)
;
|
(jusqu'à C99) | |
|
int
vfprintf
(
FILE
*
restrict
stream,
const
char
*
restrict
format,
va_list vlist ) ; |
(depuis C99) | |
| (3) | ||
|
int
vsprintf
(
char
*
buffer,
const
char
*
format, va_list vlist
)
;
|
(jusqu'à C99) | |
|
int
vsprintf
(
char
*
restrict
buffer,
const
char
*
restrict
format,
va_list vlist ) ; |
(depuis C99) | |
|
int
vsnprintf
(
char
*
restrict
buffer,
size_t
bufsz,
const char * restrict format, va_list vlist ) ; |
(4) | (depuis C99) |
|
int
vprintf_s
(
const
char
*
restrict
format, va_list vlist
)
;
|
(5) | (depuis C11) |
|
int
vfprintf_s
(
FILE
*
restrict
stream,
const
char
*
restrict
format,
va_list vlist ) ; |
(6) | (depuis C11) |
|
int
vsprintf_s
(
char
*
restrict
buffer, rsize_t bufsz,
const char * restrict format, va_list vlist ) ; |
(7) | (depuis C11) |
|
int
vsnprintf_s
(
char
*
restrict
buffer, rsize_t bufsz,
const char * restrict format, va_list vlist ) ; |
(8) | (depuis C11) |
Charge les données depuis les emplacements, définis par vlist , les convertit en équivalents de chaîne de caractères et écrit les résultats vers divers récepteurs.
-
-
le spécificateur de conversion
%nest présent dans format -
l'un des arguments correspondant à
%sest un pointeur nul - format ou buffer est un pointeur nul
- bufsz est zéro ou supérieur à RSIZE_MAX
- des erreurs d'encodage se produisent dans l'un des spécificateurs de conversion de chaîne et de caractère
-
(pour
vsprintf_suniquement), la chaîne à stocker dans buffer (y compris le caractère nul final) dépasserait bufsz
-
le spécificateur de conversion
vprintf_s
,
vfprintf_s
,
vsprintf_s
, et
vsnprintf_s
ne sont garanties d'être disponibles que si
__STDC_LIB_EXT1__
est défini par l'implémentation et si l'utilisateur définit
__STDC_WANT_LIB_EXT1__
à la constante entière
1
avant d'inclure
<stdio.h>
.
Table des matières |
Paramètres
| stream | - | flux de fichier de sortie vers lequel écrire |
| buffer | - | pointeur vers une chaîne de caractères à écrire |
| bufsz | - | jusqu'à bufsz - 1 caractères peuvent être écrits, plus le terminateur nul |
| format | - | pointeur vers une chaîne de caractères terminée par un nul spécifiant comment interpréter les données |
| vlist | - | liste d'arguments variables contenant les données à imprimer. |
La chaîne de
format
est composée de caractères octets ordinaires (sauf
%
), qui sont copiés inchangés dans le flux de sortie, et de spécifications de conversion. Chaque spécification de conversion a le format suivant :
-
-
introductoire
%caractère.
-
introductoire
-
- (optionnel) un ou plusieurs drapeaux qui modifient le comportement de la conversion :
-
-
-: le résultat de la conversion est justifié à gauche dans le champ (par défaut il est justifié à droite). -
+: le signe des conversions signées est toujours ajouté au début du résultat de la conversion (par défaut le résultat est précédé d'un moins uniquement lorsqu'il est négatif). -
espace
: si le résultat d'une conversion signée ne commence pas par un caractère de signe, ou est vide, un espace est ajouté au début du résultat. Il est ignoré si le drapeau
+est présent. -
#: la forme alternative de la conversion est effectuée. Voir le tableau ci-dessous pour les effets exacts, sinon le comportement est indéfini. -
0: pour les conversions de nombres entiers et à virgule flottante, des zéros non significatifs sont utilisés pour remplir le champ au lieu des caractères espace . Pour les nombres entiers, il est ignoré si la précision est explicitement spécifiée. Pour d'autres conversions, l'utilisation de ce drapeau entraîne un comportement indéfini. Il est ignoré si le drapeau-est présent.
-
-
-
(optionnel)
valeur entière ou
*qui spécifie la largeur minimale du champ. Le résultat est complété avec des caractères espace (par défaut), si nécessaire, à gauche lors de l'alignement à droite, ou à droite lors de l'alignement à gauche. Dans le cas où*est utilisé, la largeur est spécifiée par un argument supplémentaire de type int , qui apparaît avant l'argument à convertir et l'argument fournissant la précision si celle-ci est fournie. Si la valeur de l'argument est négative, cela entraîne l'activation du drapeau-et une largeur de champ positive (Note : Ceci est la largeur minimale : La valeur n'est jamais tronquée.).
-
(optionnel)
valeur entière ou
-
-
(optionnel)
.suivi d'un nombre entier ou*, ou ni l'un ni l'autre, qui spécifie la précision de la conversion. Dans le cas où*est utilisé, la précision est spécifiée par un argument supplémentaire de type int , qui apparaît avant l'argument à convertir, mais après l'argument fournissant la largeur minimale du champ si celui-ci est fourni. Si la valeur de cet argument est négative, elle est ignorée. Si ni un nombre ni*n'est utilisé, la précision est prise comme zéro. Voir le tableau ci-dessous pour les effets exacts de la précision .
-
(optionnel)
-
- (optionnel) modificateur de longueur qui spécifie la taille de l'argument (en combinaison avec le spécificateur de format de conversion, il spécifie le type de l'argument correspondant).
-
- 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 uniquement depuis C99→ | Oui | Oui | Oui | Oui | Oui | |||||
%
|
Écrit le caractère littéral
%
. La spécification de conversion complète doit être
%%
.
|
N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
c
|
Écrit un caractère unique .
|
N/A | N/A |
int
|
wint_t
|
N/A | N/A | N/A | N/A | N/A |
s
|
Écrit une chaîne de caractères .
|
N/A | N/A |
char
*
|
wchar_t
*
|
N/A | N/A | N/A | N/A | N/A |
d
i
|
Convertit un entier signé en représentation décimale [-]dddd .
|
signed
char
|
short
|
int
|
long
|
long
long
|
※
|
N/A | ||
o
|
Convertit un entier non signé en représentation octale oooo .
|
unsigned
char
|
unsigned
short
|
unsigned
int
|
unsigned
long
|
unsigned
long
long
|
version non signée de
ptrdiff_t
|
N/A | ||
x
X
|
Convertit un entier non signé en représentation hexadécimale hhhh .
|
N/A | ||||||||
u
|
Convertit un entier non signé en représentation décimale dddd .
|
N/A | ||||||||
f
F
(C99)
|
Convertit un nombre à virgule flottante en notation décimale selon le style [-]ddd.ddd .
|
N/A | N/A |
double
|
double
(C99)
|
N/A | N/A | N/A | N/A |
long
double
|
e
E
|
Convertit un nombre à virgule flottante en notation exponentielle décimale.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
a
A
(C99) |
Convertit un nombre à virgule flottante en notation exponentielle hexadécimale.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
g
G
|
Convertit un nombre à virgule flottante en notation décimale ou exponentielle décimale selon la valeur et la précision .
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
n
|
Retourne le nombre de caractères écrits jusqu'à présent par cet appel de la fonction.
|
signed
char
*
|
short
*
|
int
*
|
long
*
|
long
long
*
|
intmax_t
*
|
※
|
N/A | |
p
|
Écrit une séquence de caractères définie par l'implémentation représentant un pointeur . |
N/A | N/A |
void
*
|
N/A | N/A | N/A | N/A | N/A | N/A |
| Notes | ||||||||||
|
Les fonctions de conversion en virgule flottante convertissent l'infini en
La valeur non numérique est convertie en
Les conversions
Le spécificateur de conversion utilisé pour afficher char , unsigned char , signed char , short , et unsigned short attend des types promus des promotions d'arguments par défaut , mais avant l'affichage, sa valeur sera convertie en char , unsigned char , signed char , short , et unsigned short . Il est sûr de passer des valeurs de ces types en raison de la promotion qui a lieu lors de l'appel d'une fonction variadique.
Les spécifications de conversion correctes pour les types de caractères de largeur fixe (
int8_t
, etc.) sont définies dans l'en-tête
<inttypes.h>
(bien que
PRIdMAX
,
PRIuMAX
, etc. soient synonymes de
Le spécificateur de conversion d'écriture en mémoire
Il y a un
point de séquence
après l'action de chaque spécificateur de conversion ; cela permet de stocker plusieurs résultats
Si une spécification de conversion est invalide, le comportement est indéfini. |
||||||||||
Valeur de retour
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 fait par l'appelant.
vsnprintf_s
, contrairement à
vsprintf_s
, tronquera le résultat pour qu'il tienne dans le tableau pointé par
buffer
.
L'implémentation de
vsnprintf_s
dans le
CRT Microsoft
n'est pas conforme au standard C. La version de Microsoft possède un paramètre supplémentaire
size_t
count
en troisième position qui contient le nombre maximum de caractères à écrire, sans inclure le terminateur nul. Ce paramètre est potentiellement distinct de la taille du tampon fournie via le paramètre
size_t
bufsz
.
Exemple
#include <stdarg.h> #include <stdio.h> #include <time.h> void debug_log(const char* fmt, ...) { struct timespec ts; timespec_get(&ts, TIME_UTC); char time_buf[100]; size_t rc = strftime(time_buf, sizeof time_buf, "%D %T", gmtime(&ts.tv_sec)); snprintf(time_buf + rc, sizeof time_buf - rc, ".%06ld UTC", ts.tv_nsec / 1000); va_list args1; va_start(args1, fmt); va_list args2; va_copy(args2, args1); char buf[1+vsnprintf(NULL, 0, fmt, args1)]; va_end(args1); vsnprintf(buf, sizeof buf, fmt, args2); va_end(args2); printf("%s [debug]: %s\n", time_buf, buf); } int main(void) { debug_log("Logging, %d, %d, %d", 1, 2, 3); }
Sortie possible :
02/20/15 21:58:09.072683 UTC [debug]: Logging, 1, 2, 3
Références
- Norme C23 (ISO/CEI 9899:2024) :
-
- 7.21.6.8 La fonction vfprintf (p: TBD)
-
- 7.21.6.10 La fonction vprintf (p: TBD)
-
- 7.21.6.12 La fonction vsnprintf (p: TBD)
-
- 7.21.6.13 La fonction vsprintf (p: TBD)
-
- K.3.5.3.8 La fonction vfprintf_s (p: TBD)
-
- K.3.5.3.10 La fonction vprintf_s (p: TBD)
-
- K.3.5.3.12 La fonction vsnprintf_s (p: TBD)
-
- K.3.5.3.13 La fonction vsprintf_s (p: TBD)
- Norme C17 (ISO/CEI 9899:2018) :
-
- 7.21.6.8 La fonction vfprintf (p: 238)
-
- 7.21.6.10 La fonction vprintf (p: 239)
-
- 7.21.6.12 La fonction vsnprintf (p: 239-240)
-
- 7.21.6.13 La fonction vsprintf (p: 240)
-
- K.3.5.3.8 La fonction vfprintf_s (p: 434)
-
- K.3.5.3.10 La fonction vprintf_s (p: 435)
-
- K.3.5.3.12 La fonction vsnprintf_s (p: 436-437)
-
- K.3.5.3.13 La fonction vsprintf_s (p: 437)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.21.6.8 La fonction vfprintf (p: 326-327)
-
- 7.21.6.10 La fonction vprintf (p: 328)
-
- 7.21.6.12 La fonction vsnprintf (p: 329)
-
- 7.21.6.13 La fonction vsprintf (p: 329)
-
- K.3.5.3.8 La fonction vfprintf_s (p: 597)
-
- K.3.5.3.10 La fonction vprintf_s (p: 598-599)
-
- K.3.5.3.12 La fonction vsnprintf_s (p: 600)
-
- K.3.5.3.13 La fonction vsprintf_s (p: 601)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.19.6.8 La fonction vfprintf (p : 292)
-
- 7.19.6.10 La fonction vprintf (p : 293)
-
- 7.19.6.12 La fonction vsnprintf (p : 294)
-
- 7.19.6.13 La fonction vsprintf (p : 295)
- Norme C89/C90 (ISO/IEC 9899:1990) :
-
- 4.9.6.7 La fonction vfprintf
-
- 4.9.6.8 La fonction vprintf
-
- 4.9.6.9 La fonction vsprintf
Voir aussi
|
(C95)
(C95)
(C95)
(C11)
(C11)
(C11)
(C11)
|
imprime une sortie formatée de caractères larges vers
stdout
, un flux de fichier
ou un tampon en utilisant une liste d'arguments variable (fonction) |
|
(C99)
(C11)
(C11)
(C11)
(C11)
|
imprime une sortie formatée vers
stdout
, un flux de fichier ou un tampon
(fonction) |
|
(C99)
(C99)
(C99)
(C11)
(C11)
(C11)
|
lit une entrée formatée depuis
stdin
, un flux de fichier ou un tampon
en utilisant une liste d'arguments variable (fonction) |
|
documentation C++
pour
vprintf
,
vfprintf
,
vsprintf
,
vsnprintf
|
|