Namespaces
Variants

vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s

From cppreference.net
< c ‎ | io
File input/output
Types and objects
Direct input/output
Formatted output
vprintf vfprintf vsprintf vsnprintf vprintf_s vfprintf_s vsprintf_s vsnprintf_s
(C99) (C11) (C11) (C11) (C11)
File positioning
Error handling
Operations on files
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.

1) Écrit les résultats vers stdout .
2) Écrit les résultats dans un flux de fichier stream .
3) Écrit les résultats dans une chaîne de caractères buffer .
4) Écrit les résultats dans une chaîne de caractères 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 seraient écrits sans inclure le terminateur nul) est toujours calculée et renvoyée.
5-8) Identique à (1-4) , sauf que les erreurs suivantes sont détectées à l'exécution et appellent la fonction gestionnaire de 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 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_s uniquement), la chaîne à stocker dans buffer (y compris le caractère nul final) dépasserait bufsz
Comme pour toutes les fonctions à vérification des limites, 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.
  • (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) . 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) 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 .

  • L'argument est d'abord converti en unsigned char .
  • Si le modificateur l est utilisé, l'argument est d'abord converti en chaîne de caractères comme avec %ls avec un argument wchar_t [ 2 ] .
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 .

  • L'argument doit être un pointeur vers le premier élément d'un tableau de caractères.
  • Précision spécifie le nombre maximum d'octets à écrire. Si Précision n'est pas spécifiée, écrit chaque octet jusqu'au premier terminateur nul (non inclus).
  • Si le spécificateur l est utilisé, l'argument doit être un pointeur vers le premier élément d'un tableau de wchar_t , qui est converti en tableau de caractères comme par un appel à wcrtomb avec un état de conversion initialisé à zéro.
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 à afficher. La précision par défaut est 1 .
  • Si la valeur convertie et la précision sont toutes deux 0 , la conversion ne produit aucun caractère.
  • Pour le modificateur z , le type d'argument attendu est la version signée de size_t .
signed char
short
int
long
long long
N/A
o

Convertit un entier non signé en représentation octale oooo .

  • Précision spécifie le nombre minimum de chiffres à afficher. La précision par défaut est 1 .
  • Si la valeur convertie et la précision sont toutes deux 0 , la conversion ne produit aucun caractère.
  • Dans l' implémentation alternative , la précision est augmentée si nécessaire pour écrire un zéro initial. Dans ce cas, si la valeur convertie et la précision sont toutes deux 0 , un seul 0 est écrit.
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 .

  • Pour la conversion x les lettres abcdef sont utilisées.
  • Pour la conversion X les lettres ABCDEF sont utilisées.
  • Précision spécifie le nombre minimum de chiffres à afficher. La précision par défaut est 1 .
  • Si la valeur convertie et la précision sont toutes deux 0 la conversion ne produit aucun caractère.
  • Dans l' implémentation alternative 0x ou 0X est préfixé aux résultats si la valeur convertie est non nulle.
N/A
u

Convertit un entier non signé en représentation décimale dddd .

  • Précision spécifie le nombre minimum de chiffres à afficher.
  • La précision par défaut est 1 .
  • Si la valeur convertie et la précision sont toutes deux 0 , la conversion ne produit aucun caractère.
N/A
f
F (C99)

Convertit un nombre à virgule flottante en notation décimale selon le style [-]ddd.ddd .

  • Précision spécifie le nombre exact de chiffres à afficher après le séparateur décimal.
  • La précision par défaut est 6 .
  • Dans l' implémentation alternative , le séparateur décimal est écrit même si aucun chiffre ne le suit.
  • Pour le style de conversion des infinis et des NaN, voir les notes .
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.

  • Pour le style de conversion e , la notation [-]d.ddd  e ±dd est utilisée.
  • Pour le style de conversion E , la notation [-]d.ddd  E ±dd est utilisée.
  • L'exposant contient au moins deux chiffres, plus de 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 exact de chiffres à afficher après le séparateur décimal.
  • La précision par défaut est 6 .
  • Dans l' implémentation alternative , le séparateur décimal est écrit même si aucun chiffre ne le suit.
  • Pour la conversion des infinis et des NaN, voir les notes .
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.

  • Pour le style de conversion a , la notation [-]  0x h.hhh  p ±d est utilisée.
  • Pour le style de conversion A , la notation [-]  0X h.hhh  P ±d est utilisée.
  • 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 exact de chiffres à afficher après le caractère de point hexadécimal.
  • La précision par défaut est suffisante pour la représentation exacte de la valeur.
  • Dans l' implémentation alternative , le caractère de point décimal est écrit même si aucun chiffre ne le suit.
  • Pour la conversion des infinis et des NaN, voir les notes .
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 .

  • Pour le style de conversion g , la conversion sera effectuée avec le style e ou f .
  • Pour le style de conversion G , la conversion sera effectuée avec le style E ou f (jusqu'en C99) F (depuis C99) .
  • Soit P égal à 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 . Alors, si une conversion avec le style E aurait un exposant X :
    • Si P > X ≥ −4 , la conversion se fait avec le style f ou F (depuis C99) et la précision P − 1 − X .
    • Sinon, la conversion se fait avec le style e ou E et la précision P − 1 .
  • Sauf si la représentation alternative est demandée, les zéros de fin sont supprimés, et le caractère de point décimal est également supprimé s'il ne reste aucune partie fractionnaire.
  • Pour la conversion des infinis et des NaN, 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 de la fonction.

  • Le résultat est écrit dans la valeur pointée par l'argument.
  • La spécification ne peut contenir aucune drapeau , largeur de champ , ou précision .
  • Pour le modificateur z , le type d'argument attendu est S * , où S est la version signée de size_t .
signed char *
short *
int *
long *
long long *
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 inf ou infinity . Le choix est défini par l'implémentation.

La valeur non numérique est convertie en nan ou nan( char_sequence ) . Le choix est défini par l'implémentation.

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

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 %jd , %ju , etc.).

Le spécificateur de conversion d'écriture en mémoire %n est une cible courante d'exploitations de sécurité où les chaînes de format dépendent de l'entrée utilisateur et n'est pas pris en charge par la famille de fonctions printf_s à vérification de limites (depuis C11) .

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 %n dans la même variable ou, comme cas particulier, d'afficher une chaîne modifiée par un précédent %n dans le même appel.

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

Valeur de retour

1-3) Le nombre de caractères écrits en cas de succès ou une valeur négative en cas d'erreur.
4) Le nombre de caractères écrits en cas de succès ou une valeur négative en cas d'erreur. Si la chaîne résultante est tronquée en raison de la limite buf_size , la fonction retourne le nombre total de caractères (sans inclure l'octet nul de fin) qui auraient été écrits si la limite n'avait pas été imposée.
5,6) nombre de caractères transmis au flux de sortie ou valeur négative si une erreur de sortie, une violation des contraintes d'exécution ou une erreur d'encodage s'est produite.
7) nombre de caractères écrits dans le buffer , sans compter le caractère nul (qui est toujours écrit tant que buffer n'est pas un pointeur nul et bufsz n'est pas zéro et pas supérieur à RSIZE_MAX ), ou zéro en cas de violation des contraintes d'exécution, et valeur négative en cas d'erreurs d'encodage
8) nombre de caractères non compris le caractère nul de terminaison (qui est toujours écrit tant que buffer n'est pas un pointeur nul et bufsz n'est pas zéro et pas supérieur à RSIZE_MAX ), 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.

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

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)
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