Défini dans l'en-tête
(1)
intwprintf(constwchar_t*format,...);
(depuis C95)
(jusqu'à C99)
intwprintf(constwchar_t*restrict format,...);
(depuis C99)
(2)
intfwprintf( FILE *stream,constwchar_t* format,...);
(depuis C95)
(jusqu'en C99)
intfwprintf( FILE *restrict stream,constwchar_t*restrict format,...);
(depuis C99)
(3)
intswprintf(wchar_t*buffer,size_t bufsz,constwchar_t* format,...);
(depuis C95)
(jusqu'en C99)
intswprintf(wchar_t*restrict buffer,size_t bufsz,constwchar_t*restrict format,...);
(depuis C99)
intwprintf_s(constwchar_t*restrict format,...);
(4) (depuis C11)
intfwprintf_s( FILE *restrict stream,constwchar_t*restrict format,...);
(5) (depuis C11)
intswprintf_s(wchar_t*restrict buffer,rsize_t bufsz,constwchar_t* restrict format,...);
(6) (depuis C11)
intsnwprintf_s(wchar_t* restrict s,rsize_t n,constwchar_t* restrict format,...);
(7) (depuis C11)

Charge les données à partir des emplacements donnés, les convertit en équivalents de chaînes larges et écrit les résultats dans une variété de puits.

1) Ecrit les résultats dans stdout.2) Ecrit les résultats dans un flux de fichiers stream.3) Si bufsz est supérieur à zéro, écrit les résultats dans une large chaîne de caractères. buffer. Au plus bufsz-1 caractères larges sont écrits, suivis d'un caractère large nul. Si bufsz est égal à zéro, rien n'est écrit (et buffer peut être un pointeur nul), cependant la valeur de retour (nombre de caractères larges qui seraient écrits) est toujours calculée et renvoyée.4-6) Identique à (1-3), sauf que les erreurs suivantes sont détectées au moment de l'exécution et appellent la fonction de gestion des contraintes actuellement installée :

  • le spécificateur de conversion %n est présent dans format
  • l'un des arguments correspondant à %s est un pointeur nul
  • format ou buffer est un pointeur nul
  • bufsz est égal à zéro ou supérieur à RSIZE_MAX/sizeof(wchar_t)
  • des erreurs d'encodage se produisent dans l'un des spécificateurs de conversion de chaîne et de caractère
  • (uniquement pour swprintf_s) le nombre de caractères larges à écrire, y compris le nul, dépasserait bufsz.

7) Identique à (6), sauf qu'elle tronquera le résultat pour qu'il tienne dans le tableau pointé par s. Comme toutes les fonctions à limites contrôlées, wprintf_s , fwprintf_s, swprintf_set snwprintf_s ne sont garantis d'être disponibles que si __STDC_LIB_EXT1__ est défini par l'implémentation et si l'utilisateur définit le paramètre __STDC_WANT_LIB_EXT1__ à la constante entière 1 avant d'inclure stdio.h.

Paramètres

flux - flux du fichier de sortie dans lequel écrire
tampon - pointeur vers une large chaîne de caractères à écrire
bufsz - jusqu'à bufsz-1 peuvent être écrits, plus le terminateur nul.
format - pointeur vers une chaîne large à terminaison nulle spécifiant comment interpréter les données.

La chaîne de format est composée de caractères larges ordinaires (sauf %), qui sont copiés inchangés dans le flux de sortie, et des spécifications de conversion. Chaque spécification de conversion a le format suivant :

  • introduction % caractère
  • (facultatif) 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 précédé du résultat de la conversion (par défaut, le résultat est précédé du 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 + est présent.
    • # : 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 de tête sont utilisés pour remplir le champ au lieu de espace caractères. Pour les nombres entiers, il est ignoré si la précision est explicitement spécifiée. Pour les autres conversions, l'utilisation de ce drapeau entraîne un comportement non défini. Il est ignoré si - est présent.
  • (facultatif) valeur entière ou * qui spécifie la largeur minimale du champ. Le résultat est complété par espace (par défaut), si nécessaire, à gauche si justifié à droite, ou à droite si justifié à gauche. Dans le cas où * est utilisé, la largeur est spécifiée par un argument supplémentaire de type int. Si la valeur de l'argument est négative, il en résulte avec l'argument - spécifié et une largeur de champ positive. (Remarque : il s'agit de la largeur minimale : la valeur n'est jamais tronquée).
    • (facultatif). suivi d'un nombre entier ou *ou ni l'un ni l'autre qui spécifie précision de la conversion. Dans le cas où * est utilisée, la précision précision est spécifiée par un argument supplémentaire de type int. 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 égale à zéro. Voir le tableau ci-dessous pour les effets exacts de précision.
    • (facultatif)modificateur de longueur qui spécifie la taille de l'argument
    • spécificateur de format de conversion

Les spécificateurs de format suivants sont disponibles :

Conversion
spécificateur
Explication Type d'argument
modificateur de longueur hh

(C99).

h (aucun) l ll

(C99).

j

(C99).

z

(C99).

t

(C99).

L
% écrit un littéral %. La spécification complète de la conversion 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.

L'argument est d'abord converti en wchar_t comme si on appelait btowc. Si l'argument l est utilisé, le modificateur wint_t est d'abord converti en wchar_t.

N/A N/A int wint_t N/A N/A N/A N/A N/A
s écrit un chaîne de caractères

L'argument doit être un pointeur vers l'élément initial d'un tableau de caractères contenant une séquence de caractères multi-octets commençant dans l'état de décalage initial, qui est converti en tableau de caractères large comme par un appel à mbrtowc avec un état de conversion initialisé à zéro. Précision spécifie le nombre maximum de caractères larges à écrire. Si Précision n'est pas spécifié, écrit tous les caractères larges jusqu'au premier terminateur nul non compris. Si le l est utilisé, l'argument doit être un pointeur vers l'élément initial d'un tableau de caractères de type wchar_t.

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.

Précision spécifie le nombre minimum de chiffres devant apparaître. La précision par défaut est 1.
Si la valeur convertie et la précision sont toutes deux ​0​ la conversion ne donne lieu à aucun caractère.

signed char short int long long long intmax_t signé size_t ptrdiff_t N/A
o convertit un entier non signé en représentation octale oooo.

Précision spécifie le nombre minimum de chiffres qui doivent apparaître. La précision par défaut est 1. Si la valeur convertie et la précision sont toutes deux ​0​ la conversion ne donne aucun caractère. Dans le cas de implémentation alternative la précision est augmentée si nécessaire, pour écrire un zéro de tête. Dans ce cas, si la valeur convertie et la précision sont toutes deux ​0​, simple ​0​ est écrit.

unsigned char unsigned short unsigned int unsigned long unsigned long long uintmax_t size_t version non signée de ptrdiff_t N/A
x
X
convertit un entier non signé en représentation hexadécimale hhhh.

Pour le x lettres de conversion abcdef sont utilisées.
Pour les X lettres de conversion ABCDEF sont utilisées.
Précision spécifie le nombre minimum de chiffres devant apparaître. La précision par défaut est 1. Si la valeur convertie et la précision sont toutes deux ​0​ la conversion ne donne aucun caractère. Dans le cas de implémentation alternative0x ou 0X est préfixé aux résultats si la valeur convertie est non nulle.

N/A
u convertit une valeur entier non signé en représentation décimale dddd.

Précision spécifie le nombre minimum de chiffres devant apparaître. La précision par défaut est 1. Si la valeur convertie et la précision sont toutes deux ​0​ la conversion ne donne aucun caractère.

N/A
f
F
convertit nombre à virgule flottante en notation décimale dans le style [-]ddd.ddd.

Précision spécifie le nombre minimum de chiffres devant apparaître après le caractère de point décimal. La précision par défaut est 6. Dans le alternative le caractère du point décimal est écrit même si aucun chiffre ne le suit. Pour le style de conversion des infinis et des non-nombres, voir les notes.

N/A N/A double double(C99) N/A N/A N/A N/A long double
e
E
convertit nombre à virgule flottante en notation décimale de l'exposant.

Pour le e style de conversion [-]d.ddde±dd est utilisé.
Pour le E style de conversion [-]d.dddE±dd est utilisé.
L'exposant contient au moins deux chiffres, d'autres chiffres ne sont utilisés que si nécessaire. Si la valeur est ​0​l'exposant est également ​0​. Précision spécifie le nombre minimum de chiffres devant apparaître après le caractère de la virgule. La précision par défaut est 6. Dans le alternative le caractère du point décimal est écrit même si aucun chiffre ne le suit. Pour le style de conversion des infinis et des non-nombres, voir les notes.

N/A N/A N/A N/A N/A N/A
a
A

(C99).

convertit nombre à virgule flottante en notation hexadécimale de l'exposant.

Pour le a style de conversion [-]0xh.hhhp±d est utilisé.
Pour le A style de conversion [-]0Xh.hhhP±d est utilisé.
Le premier chiffre hexadécimal n'est pas 0 si l'argument est une valeur à virgule flottante normalisée. Si la valeur est ​0​l'exposant est également ​0​. Précision spécifie le nombre minimum de chiffres qui doivent apparaître après le caractère décimal. La précision par défaut est suffisante pour une représentation exacte de la valeur. Dans le implémentation alternative le caractère du point décimal est écrit même si aucun chiffre ne le suit. Pour le style de conversion des infinis et des non-nombres, voir les notes.

N/A N/A N/A N/A N/A N/A
g
G
convertit nombre à virgule flottante en notation décimale ou en exposant décimal, en fonction de la valeur et de l'élément précision.

Pour le g style de conversion conversion avec style e ou f sera effectuée.
Pour le G conversion avec style conversion avec style E ou F sera effectuée.
Laissez P égale la précision si elle est non nulle, 6 si la précision n'est pas spécifiée, ou 1 si la précision est ​0​. Ensuite, si une conversion avec le style E aurait un exposant de X:

  • si P > X ≥ -4, la conversion se fait avec le style f ou F et la précision P - 1 - X.
  • sinon, la conversion se fait avec le style e ou E et une précision P - 1.

A moins que représentation alternative ne soit demandée, les zéros de fin de ligne sont supprimés, ainsi que le caractère de point décimal si aucune partie fractionnaire n'est laissée. Pour le style de conversion de l'infini et du non-nombre, voir les notes.

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.

Le résultat est écrit à à la valeur pointée par l'argument. La spécification ne peut pas contenir de drapeau, largeur de champ ou précision.

signed char* short* int* long* long long* intmax_t* signé size_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

Les fonctions de conversion en virgule flottante convertissent l'infini en inf ou infinity. Celle qui est utilisée est définie par l'implémentation.

Pas un nombre est converti en nan ou nan(char_sequence). Lequel des deux est utilisé est défini par l'implémentation.

Les conversions F, E, G, A sortie INF, INFINITY, NAN à la place.

Même si %c s'attend à int un argument, il est sûr de passer un char en raison de la promotion des entiers qui a lieu lorsqu'une fonction variadique est appelée.

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 (bien que PRIdMAX, PRIuMAXetc soit synonyme de %jd, %ju, etc).

Le spécificateur de conversion d'écriture en mémoire %n est une cible commune des exploits de sécurité où les chaînes de format dépendent de l'entrée de l'utilisateur et n'est pas pris en charge par le contrôle des limites. printf_s de la famille des fonctions.

Il y a un point de séquence après l'action de chaque spécificateur de conversion ; cela permet de stocker de multiples fonctions %n dans la même variable ou, comme cas limite, d'imprimer une chaîne de caractères modifiée par un précédent %n précédent dans le même appel.

Si une spécification de conversion est invalide, le comportement est indéfini.

... - arguments spécifiant les données à imprimer. Si tout argument après les promotions d'arguments par défaut n'est pas du type attendu par le spécificateur de conversion correspondant, ou s'il y a moins d'arguments que ce qui est requis par la règle formatle comportement est indéfini. S'il y a plus d'arguments que ce qui est requis par format, les arguments étrangers sont évalués et ignorés.

Valeur de retour

1,2) Nombre de caractères larges écrits en cas de succès ou valeur négative si une erreur s'est produite.3) Nombre de caractères larges écrits (sans compter le caractère large nul de terminaison) en cas de succès ou valeur négative si une erreur d'encodage s'est produite ou si le nombre de caractères à générer était égal ou supérieur à... size (y compris lorsque size est égal à zéro).4,5) Nombre de caractères larges écrits en cas de succès ou valeur négative si une erreur s'est produite.6) Nombre de caractères larges (sans compter le null de terminaison) qui ont été écrits sur. buffer. Renvoie une valeur négative en cas d'erreur de codage et de dépassement de capacité. Renvoie zéro sur toutes les autres erreurs.7) Nombre de caractères larges (sans compter le null de terminaison) qui auraient été écrits dans... buffer si bufsz était suffisamment grand, ou une valeur négative si une erreur se produit. (c'est-à-dire que l'écriture a été réussie et complète seulement si le retour est non négatif et inférieur à bufsz)

Notes

Alors que les chaînes de caractères étroites fournissent snprintf, qui permet de déterminer la taille du tampon de sortie nécessaire, il n'y a pas d'équivalent pour les chaînes de caractères larges (jusqu'au snwprintf_s de C11), et pour déterminer la taille du tampon, le programme peut avoir besoin d'appeler swprintf, vérifier la valeur du résultat, et réallouer un tampon plus grand, en réessayant jusqu'à ce qu'il réussisse.

snwprintf_s, contrairement à swprintf_s, va tronquer le résultat pour qu'il tienne dans le tableau pointé par buffer, même si la troncature est traitée comme une erreur par la plupart des fonctions à contrôle de limites.

Exemple

#include#includeintmain(void){char narrow_str[]="zu00dfu6c34U0001f34c";// or "zß水🍌"// or "x7axc3x9fxe6xb0xb4xf0x9fx8dx8c";wchar_t warr[29];// the expected string is 28 characters plus 1 null terminatorsetlocale(LC_ALL,"en_US.utf8");swprintf(warr,sizeof warr/sizeof*warr,
              L"Converted from UTF-8: '%s'", narrow_str);wprintf(L"%lsn", warr);}

Sortie :

Converted from UTF-8:'zß水🍌'

Références

  • Norme C11 (ISO/IEC 9899:2011) :
    • 7.29.2.1 La fonction fwprintf (p : 403-410)
    • 7.29.2.3 La fonction swprintf (p : 416)
    • 7.29.2.11 La fonction wprintf (p : 421)
    • K.3.9.1.1 La fonction fwprintf_s (p : 628)
    • K.3.9.1.4 La fonction swprintf_s (p : 630-631)
    • K.3.9.1.13 La fonction wprintf_s (p : 637-638)
  • Norme C99 (ISO/IEC 9899:1999) :
    • 7.24.2.1 La fonction fwprintf (p : 349-356)
    • 7.24.2.3 La fonction swprintf (p : 362)
    • 7.24.2.11 La fonction wprintf (p : 366)

Voir aussi

printffprintfsprintfsnprintfprintf_sfprintf_ssprintf_ssnprintf_s(C99)(C11)(C11)(C11)(C11) imprime la sortie formatée vers stdout, un flux de fichiers ou un tampon
(fonction)
vwprintfvfwprintfvswprintfvwprintf_svfwprintf_svswprintf_svsnwprintf_s(C95)(C95)(C95)(C11)(C11)(C11)(C11) imprime la sortie de caractères larges formatés vers stdout, un flux de fichiers
ou un tampon utilisant une liste d'arguments variables
(fonction)
fputws(C95) écrit une chaîne large dans un flux de fichiers
(fonction)