vwprintf, vfwprintf, vswprintf, vwprintf_s, vfwprintf_s, vswprintf_s, vsnwprintf_s
|
Défini dans l'en-tête
<wchar.h>
|
||
| (1) | ||
|
int
vwprintf
(
const
wchar_t
*
format, va_list vlist
)
;
|
(depuis C95)
(jusqu'à C99) |
|
|
int
vwprintf
(
const
wchar_t
*
restrict
format, va_list vlist
)
;
|
(depuis C99) | |
| (2) | ||
|
int
vfwprintf
(
FILE
*
stream,
const
wchar_t
*
format, va_list vlist
)
;
|
(depuis C95)
(jusqu'à C99) |
|
|
int
vfwprintf
(
FILE
*
restrict
stream,
const wchar_t * restrict format, va_list vlist ) ; |
(depuis C99) | |
| (3) | ||
|
int
vswprintf
(
wchar_t
*
buffer,
size_t
bufsz,
const wchar_t * format, va_list vlist ) ; |
(depuis C95)
(jusqu'à C99) |
|
|
int
vswprintf
(
wchar_t
*
restrict
buffer,
size_t
bufsz,
const wchar_t * restrict format, va_list vlist ) ; |
(depuis C99) | |
|
int
vwprintf_s
(
const
wchar_t
*
restrict
format, va_list vlist
)
;
|
(4) | (depuis C11) |
|
int
vfwprintf_s
(
FILE
*
restrict
stream,
const wchar_t * restrict format, va_list vlist ) ; |
(5) | (depuis C11) |
|
int
vswprintf_s
(
wchar_t
*
restrict
buffer, rsize_t bufsz,
const wchar_t * restrict format, va_list vlist ) ; |
(6) | (depuis C11) |
|
int
vsnwprintf_s
(
wchar_t
*
restrict
buffer, rsize_t bufsz,
const wchar_t * restrict format, va_list vlist ) ; |
(7) | (depuis C11) |
Charge les données depuis les emplacements, définis par vlist , les convertit en équivalents de chaînes larges 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 / sizeof ( wchar_t )
- des erreurs d'encodage surviennent dans l'un des spécificateurs de conversion de chaîne et de caractère
-
(pour
vswprintf_suniquement), la chaîne à stocker dans buffer (y compris le caractère nul large final) dépasserait bufsz .
-
le spécificateur de conversion
-
Comme pour toutes les fonctions à vérification de limites,
vwprintf_s,vfwprintf_s,vswprintf_s, etvsnwprintf_sne 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 large en sortie vers lequel écrire |
| buffer | - | pointeur vers une chaîne large vers laquelle écrire |
| bufsz | - | nombre maximum de caractères larges à écrire |
| format | - | pointeur vers une chaîne large terminée par un caractère 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 larges ordinaires (à l'exception de
%
), qui sont copiés tels quels 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
RSIZE_MAX/sizeof(wchar_t)
), ou zéro en cas de violation de contrainte d'exécution, et valeur négative en cas d'erreur d'encodage.
RSIZE_MAX/sizeof(wchar_t)
), qui aurait été écrit dans
buffer
si
bufsz
était ignoré, ou une valeur négative si une violation des contraintes d'exécution ou une erreur d'encodage s'est produite.
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.
Alors que les chaînes étroites fournissent
vsnprintf
, ce qui permet de déterminer la taille requise du tampon de sortie, il n'existe pas d'équivalent pour les chaînes larges (jusqu'à vsnwprintf_s de C11), et afin de déterminer la taille du tampon, le programme peut avoir besoin d'appeler
vswprintf
, vérifier la valeur de résultat, et réallouer un tampon plus grand, en réessayant jusqu'à réussite.
vsnwprintf_s
, contrairement à
vswprintf_s
, tronquera le résultat pour qu'il tienne dans le tableau pointé par
buffer
, bien que la troncation soit considérée comme une erreur par la plupart des fonctions avec vérification des limites.
Exemple
#include <locale.h> #include <stdarg.h> #include <stddef.h> #include <stdio.h> #include <time.h> #include <wchar.h> void debug_wlog(const wchar_t* 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 args; va_start(args, fmt); wchar_t buf[1024]; int rc2 = vswprintf(buf, sizeof buf / sizeof *buf, fmt, args); va_end(args); if(rc2 > 0) wprintf(L"%s [debug]: %ls\n", time_buf, buf); else wprintf(L"%s [debug]: (string too long)\n", time_buf); } int main(void) { setlocale(LC_ALL, ""); debug_wlog(L"Logging, %d, %d, %d", 1, 2, 3); }
Sortie possible :
02/20/15 22:12:38.476575 UTC [debug]: Logging, 1, 2, 3
Références
- Norme C23 (ISO/CEI 9899:2024) :
-
- 7.29.2.5 La fonction vfwprintf (p: TBD)
-
- 7.29.2.7 La fonction vswprintf (p: TBD)
-
- 7.29.2.9 La fonction vwprintf (p: TBD)
-
- K.3.9.1.6 La fonction vfwprintf_s (p: TBD)
-
- K.3.9.1.8 La fonction vsnwprintf_s (p: TBD)
-
- K.3.9.1.9 La fonction vswprintf_s (p: TBD)
-
- K.3.9.1.11 La fonction vwprintf_s (p: TBD)
- Norme C17 (ISO/CEI 9899:2018) :
-
- 7.29.2.5 La fonction vfwprintf (p: TBD)
-
- 7.29.2.7 La fonction vswprintf (p: TBD)
-
- 7.29.2.9 La fonction vwprintf (p: TBD)
-
- K.3.9.1.6 La fonction vfwprintf_s (p: TBD)
-
- K.3.9.1.8 La fonction vsnwprintf_s (p: TBD)
-
- K.3.9.1.9 La fonction vswprintf_s (p: TBD)
-
- K.3.9.1.11 La fonction vwprintf_s (p: TBD)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.29.2.5 La fonction vfwprintf (p: 417-418)
-
- 7.29.2.7 La fonction vswprintf (p: 419)
-
- 7.29.2.9 La fonction vwprintf (p: 420)
-
- K.3.9.1.6 La fonction vfwprintf_s (p: 632)
-
- K.3.9.1.8 La fonction vsnwprintf_s (p: 633-634)
-
- K.3.9.1.9 La fonction vswprintf_s (p: 634-635)
-
- K.3.9.1.11 La fonction vwprintf_s (p: 636)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.24.2.5 La fonction vfwprintf (p : 363)
-
- 7.24.2.7 La fonction vswprintf (p : 364)
-
- 7.24.2.9 La fonction vwprintf (p : 365)
Voir aussi
|
(C99)
(C11)
(C11)
(C11)
(C11)
|
imprime une sortie formatée vers
stdout
, un flux de fichier ou un tampon
en utilisant une liste d'arguments variables (fonction) |
|
(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
(fonction) |
|
Documentation C++
pour
vwprintf
,
vfwprintf
,
vswprintf
|
|