vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s
| Défini dans l'en-tête <stdio.h>
|
||
int vprintf( const char* format, va_list vlist );
|
(1) | (jusqu'à C99) |
int vprintf( const char* restrict format, va_list vlist );
|
(depuis C99) | |
int vfprintf( FILE* stream, const char* format, va_list vlist );
|
(2) | (jusqu'à C99) |
int vfprintf( FILE* restrict stream, const char* restrict format,
va_list vlist );
|
(depuis C99) | |
int vsprintf( char* buffer, const char* format, va_list vlist );
|
(3) | (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 chaîne de caractères et écrit les résultats vers diverses destinations.
stream.buffer.buffer. Au maximum bufsz - 1 caractères sont écrits. La chaîne de caractères résultante sera terminée par un caractère nul, sauf si bufsz est zéro. Si bufsz est zéro, rien n'est écrit et buffer peut être un pointeur nul, cependant la valeur de retour (nombre d'octets qui auraient été écrits sans inclure le terminateur nul) est toujours calculée et retournée.- le spécificateur de conversion
%nest présent dansformat - l'un des arguments correspondant à
%sest un pointeur nul formatoubufferest un pointeur nulbufszest zéro ou supérieur à RSIZE_MAX- des erreurs d'encodage se produisent dans les spécificateurs de conversion de chaîne et de caractère
- (pour
vsprintf_suniquement), la chaîne à stocker dansbuffer(y compris le nul final) dépasseraitbufsz
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__ comme la constante entière 1 avant d'inclure <stdio.h>.Paramètres
| stream | - | flux de fichier de sortie vers lequel écrire |
| buffer | - | pointeur vers une chaîne de caractères dans laquelle é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 nul spécifiant comment interpréter les données |
| vlist | - | liste d'arguments variables contenant les données à imprimer. |
La chaîne format est constitué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 :
- caractère d'introduction
%.
- caractère d'introduction
- (optionnel) un ou plusieurs drapeaux qui modifient le comportement de la conversion :
-: le résultat de la conversion est aligné à gauche dans le champ (par défaut il est aligné à droite).+: le signe des conversions signées est toujours préfixé au résultat de la conversion (par défaut le résultat est précédé du signe moins seulement lorsqu'il est négatif).- espace: si le résultat d'une conversion signée ne commence pas par un signe, ou est vide, un espace est préfixé au 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 rempli avec des caractères espace (par défaut), si nécessaire, à gauche lorsqu'il est aligné à droite, ou à droite s'il est aligné à gauche. Dans le cas où*est utilisé, la largeur est spécifiée par un argument supplémentaire de typeint, qui apparaît avant l'argument à convertir et l'argument fournissant la précision si elle est fournie. Si la valeur de l'argument est négative, cela équivaut à spécifier le drapeau-et une largeur de champ positive (Remarque : c'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 typeint, qui apparaît avant l'argument à convertir, mais après l'argument fournissant la largeur minimale du champ s'il 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 considérée 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 :
| Conversion Spécificateur |
Explication | Type d'argument attendu | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Modificateur de longueur→ | hh | h | aucun | l | ll | j | z | t | L | |
| Disponible depuis C99 uniquement→ | 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 seul caractère.
|
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 |
di
|
Convertit un entier signé en représentation décimale [-]dddd.
|
signed char |
short |
int |
long |
long long |
intmax_t |
※ |
ptrdiff_t |
N/A |
bB (optionnel)
(C23) |
Convertit un entier non signé en représentation binaire bbbb.
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
version non signée de ptrdiff_t |
N/A |
o
|
Convertit un entier non signé en représentation octale oooo.
|
N/A | ||||||||
xX
|
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 | ||||||||
fF (C99)
|
Convertit un nombre à virgule flottante en notation décimale sous la forme [-]ddd.ddd.
|
N/A | N/A | double |
double (C99) |
N/A | N/A | N/A | N/A | long double |
eE
|
Convertit un nombre à virgule flottante en notation exponentielle décimale.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
aA
(C99) |
Convertit un nombre à virgule flottante en notation exponentielle hexadécimale.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
gG
|
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 à la fonction.
|
signed char* |
short* |
int* |
long* |
long long* |
intmax_t * |
※ |
ptrdiff_t * |
N/A |
p
|
Écrit une séquence de caractères définie par l'implémentation définissant un pointeur. |
N/A | N/A | void* |
N/A | N/A | N/A | N/A | N/A | N/A |
| Notes | ||||||||||
|
Les fonctions de conversion à virgule flottante convertissent l'infini en Not-a-number est converti en Les conversions Le spécificateur de conversion utilisé pour imprimer Les spécifications de conversion correctes pour les types de caractères à 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
buf_size, la fonction retourne le nombre total de caractères (sans compter l'octet nul final) qui auraient été écrits si la limite n'avait pas été imposée.buffer, sans compter le caractère nul (qui est toujours écrit tant que buffer n'est pas un pointeur nul et que bufsz n'est pas nul et n'est pas supérieur à RSIZE_MAX), ou zéro en cas de violation de contrainte d'exécution, et valeur négative en cas d'erreurs d'encodagebuffer n'est pas un pointeur nul et que bufsz n'est pas nul et n'est pas supérieur à RSIZE_MAX), qui auraient été écrits dans buffer si bufsz avait été ignoré, ou une valeur négative si une violation de contrainte d'exécution ou une erreur d'encodage s'est produiteNotes
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, va tronquer 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 à la norme C. La version de Microsoft a un paramètre supplémentaire size_t count en troisième position qui contient le nombre maximal de caractères à écrire, sans compter le terminateur nul. Ce paramètre est éventuellement 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, 3Références
- Norme C23 (ISO/IEC 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/IEC 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/IEC 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/IEC 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 large formatée vers stdout, un flux de fichier ou un tampon en utilisant une liste d'arguments variables (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 variables (fonction) |
Documentation C++ pour vprintf, vfprintf, vsprintf, vsnprintf
| |