Man page - snprintf(3)

Packages contains this manual

Available languages:

en fr nl ja de

Manual

printf

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
CHAÎNE DE FORMAT
Caractùres d’attribut
Largeur de champ
Précision
Modificateur de longueur
Indicateurs de conversion
VALEUR RENVOYÉE
ATTRIBUTS
STANDARDS
HISTORIQUE
AVERTISSEMENTS
BOGUES
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

printf, fprintf, dprintf, sprintf, snprintf, vprintf, vfprintf, vdprintf, vsprintf, vsnprintf — Formatage des sorties

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <stdio.h>

int printf(const char *restrict format , ...);
int fprintf(FILE *restrict
flux ,
const char *restrict
format , ...);
int dprintf(int
fd ,
const char *restrict
format , ...);
int sprintf(char *restrict
chaĂźne ,
const char *restrict
format , ...);
int snprintf(char
chaĂźne [restrict . taille ], size_t taille ,
const char *restrict
format , ...);

int vprintf(const char *restrict format , va_list ap );
int vfprintf(FILE *restrict
flux ,
const char *restrict
format , va_list ap );
int vdprintf(int
fd ,
const char *restrict
format , va_list ap );
int vsprintf(char *restrict
chaĂźne ,
const char *restrict
format , va_list ap );
int vsnprintf(char
chaĂźne [restrict . taille ], size_t taille ,
const char *restrict
format , va_list ap );

Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros (7)) :

snprintf (), vsnprintf () :
_XOPEN_SOURCE >= 500 || _ISOC99_SOURCE
|| /* glibc <= 2.19 : */ _BSD_SOURCE

dprintf (), vdprintf () :
Depuis la glibc 2.10 :
_POSIX_C_SOURCE >= 200809L
Avant la glibc 2.10 :
_GNU_SOURCE

DESCRIPTION

Les fonctions de la famille printf () produisent des sorties en accord avec le format décrit plus bas. Les fonctions printf () et vprintf () écrivent leur sortie sur stdout , le flux de sortie standard. fprintf () et vfprintf () écrivent sur le flux flux indiqué. sprintf (), snprintf (), vsprintf () et vsnprintf () écrivent leurs sorties dans la chaßne de caractÚres chaßne .

La fonction dprintf () est Ă©quivalente Ă  fprintf () si ce n’est qu’elle Ă©crit dans un descripteur de fichier fd plutĂŽt que dans un flux stdio (3).

The functions snprintf () and vsnprintf () write at most size bytes (including the terminating null byte ('\0')) to str .

Les fonctions vprintf (), vfprintf (), vdprintf (), vsprintf () et vsnprintf () sont Ă©quivalentes aux fonctions printf (), fprintf (), dprintf (), sprintf () et snprintf () respectivement, mais elles emploient un tableau va_list Ă  la place d’un nombre variable d’arguments. Ces fonctions n’appellent pas la macro va_end . Du fait qu’elles appellent la macro va_arg , la valeur de ap n’est pas dĂ©finie aprĂšs l’appel. Consultez stdarg (3).

Toutes ces fonctions Ă©crivent leurs sorties sous le contrĂŽle d’une chaĂźne de format qui indique les conversions Ă  apporter aux arguments suivants (ou accessibles Ă  travers les fonctions d’argument de taille variable de stdarg (3)).

C99 et POSIX.1-2001 spĂ©cifient que les rĂ©sultats ne sont pas dĂ©finis si un appel Ă  sprintf (), snprintf (), vsprintf () ou vsnprintf () causait la copie entre des objets qui se chevauchent (par exemple, si le tableau de la chaĂźne cible et un des paramĂštres d’entrĂ©e se trouvent dans le mĂȘme tampon). Consultez la section AVERTISSEMENTS

CHAÎNE DE FORMAT

La chaĂźne de format est une chaĂźne de caractĂšres, commençant et se terminant dans son Ă©tat de dĂ©calage initial, si prĂ©sent. La chaĂźne de format est composĂ©e de zĂ©ro ou plus d’indicateurs : les caractĂšres ordinaires (diffĂ©rents de % ), qui sont copiĂ©s sans modification sur la sortie, et les spĂ©cifications de conversion, qui chacune recherche zĂ©ro ou plus d’arguments suivants. Les spĂ©cifications de conversion sont introduites par le caractĂšre % et se terminent par un indicateur de conversion . Entre eux peuvent se trouver (dans l’ordre), zĂ©ro ou plusieurs attributs , une valeur optionnelle de largeur minimale de champ , une valeur optionnelle de prĂ©cision et un Ă©ventuel modificateur de longueur .

La syntaxe gĂ©nĂ©rale d’un format de conversion est :

%[$][attributs][largeur][.précision][modificateur de longueur]conversion

Les arguments doivent correspondre correctement (aprĂšs les promotions de types) avec les indicateurs de conversion. Par dĂ©faut les arguments sont pris dans l’ordre indiquĂ©, oĂč chaque « * » (voir Largeur de champ et PrĂ©cision ci-aprĂšs) et chaque indicateur de conversion rĂ©clament un nouvel argument (et l’insuffisance d’arguments est une erreur). On peut aussi prĂ©ciser explicitement quel argument prendre, en Ă©crivant, Ă  chaque conversion, « %m$ » au lieu de « % », et « *m$ » au lieu de « * ». L’entier dĂ©cimal m indique la position dans la liste d’arguments, l’indexation commençant Ă  1 . Ainsi,

printf("%*d", largeur, numéro);

et

printf("%2$*1$d", largeur, numéro);

sont Ă©quivalents. La seconde notation permet de rĂ©pĂ©ter plusieurs fois le mĂȘme argument. Le standard C99 n’autorise pas le style utilisant « $ », qui provient des SpĂ©cifications UNIX Single. Si le style avec « $ » est utilisĂ©, il faut l’employer pour toutes conversions prenant un argument et pour tous les arguments de largeur et de prĂ©cision, mais on peut le mĂ©langer avec des formats « %% » qui ne consomment pas d’arguments. Il ne doit pas y avoir de sauts dans les numĂ©ros des arguments spĂ©cifiĂ©s avec « $ ». Par exemple, si les arguments 1 et 3 sont spĂ©cifiĂ©s, l’argument 2 doit aussi ĂȘtre mentionnĂ© quelque part dans la chaĂźne de format.

Pour certaines conversions numĂ©riques, un caractĂšre de sĂ©paration dĂ©cimale (le point par dĂ©faut) est utilisĂ©, ainsi qu’un caractĂšre de regroupement par millier. Les vĂ©ritables caractĂšres dĂ©pendent de la valeur de LC_NUMERIC dans la locale (consultez setlocale (3)). La localisation POSIX utilise « . » comme sĂ©parateur dĂ©cimal, et n’a pas de caractĂšre de regroupement. Ainsi,

printf("%'.2f", 1234567.89);

s’affichera comme « 1234567.89 » dans la localisation POSIX, « 1 234 567,89 » en localisation fr_FR, et « 1.234.567,89 » en localisation da_DK.

Caractùres d’attribut

Le caractĂšre % peut ĂȘtre Ă©ventuellement suivi par zĂ©ro ou plusieurs des attributs suivants :

#

Indique que la valeur doit ĂȘtre convertie en une autre forme. Pour les conversions o le premier caractĂšre de la chaĂźne de sortie vaudra zĂ©ro (en ajoutant un prĂ©fixe 0 si ce n’est pas dĂ©jĂ  un zĂ©ro). Pour les conversions x et X un rĂ©sultat non nul reçoit le prĂ©fixe « 0x » (ou « 0X » pour l’indicateur X ). Pour les conversions a , A , e , E , f , F , g et G , le rĂ©sultat contiendra toujours un point dĂ©cimal mĂȘme si aucun chiffre ne le suit (normalement, un point dĂ©cimal n’est prĂ©sent avec ces conversions que si des dĂ©cimales le suivent). Pour les conversions g et G , les zĂ©ros en fin ne sont pas Ă©liminĂ©s, contrairement au comportement habituel. Pour m , si errno contient un code d’erreur valable, la sortie de strerrorname_np(errno) est affichĂ©e ; autrement, la valeur stockĂ©e dans errno est affichĂ©e sous la forme d’un nombre dĂ©cimal. Pour les autres conversions, le rĂ©sultat est indĂ©fini.

0

Indique le remplissage avec des zĂ©ros. Pour les conversions d , i , o , u , x , X , a , A , e , E , f , F , g et G , la valeur est complĂ©tĂ©e Ă  gauche par des zĂ©ros plutĂŽt que par des espaces. Si les attributs 0 et - apparaissent ensemble, l’attribut 0 est ignorĂ©. Si une prĂ©cision est fournie avec une conversion entiĂšre ( d , i , o , u , x et X ), l’attribut 0 est ignorĂ©. Pour les autres conversions, le comportement est indĂ©fini.

-

Indique que la valeur convertie doit ĂȘtre justifiĂ©e sur la limite gauche du champ (par dĂ©faut elle l’est Ă  droite). Les valeurs sont complĂ©tĂ©es Ă  droite par des espaces, plutĂŽt qu’à gauche par des zĂ©ros ou des espaces. Un attribut - surcharge un attribut 0 si les deux sont fournis.

' '

(une espace) Un blanc indique qu’une espace doit ĂȘtre laissĂ©e avant un nombre positif (ou une chaĂźne vide) produit par une conversion signĂ©e

+

Un signe ( + ou - ) doit toujours ĂȘtre placĂ© avant un nombre produit par une conversion signĂ©e. Par dĂ©faut, un signe n’est utilisĂ© que pour les valeurs nĂ©gatives. Un attribut + surcharge un attribut « espace » si les deux sont fournis.

Les cinq caractĂšres d’attributs ci-dessus sont dĂ©finis dans la norme C99, les SpĂ©cifications UNIX Single en ajoutent un :

'

Les conversions dĂ©cimales ( i , d , u , f , F , g et G ) indiquent que les chiffres d’un argument numĂ©rique doivent ĂȘtre groupĂ©s par millier en fonction de la localisation (consultez setlocale (3)). Remarquez que de nombreuses versions de gcc (1) n’acceptent pas cet attribut et dĂ©clencheront un avertissement (SUSv2 n’inclut pas %'F , mais SUSv3 l’a ajoutĂ©). Notez aussi que la localisation par dĂ©faut d’un programme C est « C » dont les informations de localisation n’indiquent pas de caractĂšre de groupage par millier. Donc, sans un appel prĂ©alable Ă  setlocale (3), aucun caractĂšre de regroupement par millier ne sera affichĂ©.

La glibc 2.2 ajoute un caractĂšre d’attribut supplĂ©mentaire.

I

Pour les conversions dĂ©cimales ( i , d et u ), la sortie emploie les chiffres de la localisation alternative s’il y en a une. Par exemple, depuis la glibc 2.2.3, cela donnera des chiffres arabes pour la localisation perse (« fa_IR »).

Largeur de champ

Un nombre optionnel ne commençant pas par un zĂ©ro, peut indiquer une largeur minimale de champ. Si la valeur convertie occupe moins de caractĂšres que cette largeur, elle sera complĂ©tĂ©e par des espaces Ă  gauche (ou Ă  droite si l’attribut d’alignement Ă  gauche a Ă©tĂ© fourni). À la place de la chaĂźne reprĂ©sentant le nombre dĂ©cimal, on peut Ă©crire « * » ou « *m$ » ( m Ă©tant entier) pour indiquer que la largeur du champ est fournie dans l’argument suivant ou dans le m -iĂšme argument respectivement. L’argument fournissant la largeur doit ĂȘtre de type int . Une largeur nĂ©gative est considĂ©rĂ©e comme l’attribut « - », vu plus haut, suivi d’une largeur positive. En aucun cas une largeur trop petite ne provoque la troncature du champ. Si le rĂ©sultat de la conversion est plus grand que la largeur indiquĂ©e, le champ est Ă©largi pour contenir le rĂ©sultat.

Précision

Une prĂ©cision optionnelle, sous la forme d’un point (« . ») suivi par une chaĂźne optionnelle de nombres dĂ©cimaux. À la place de la chaĂźne reprĂ©sentant le nombre dĂ©cimal, on peut Ă©crire « * » ou « *m$ » ( m Ă©tant entier) pour indiquer que la prĂ©cision est fournie dans l’argument suivant ou dans le m -iĂšme argument respectivement, et qui doit ĂȘtre de type int . Si la prĂ©cision ne contient que le caractĂšre « . », elle est considĂ©rĂ©e comme zĂ©ro. Une prĂ©cision nĂ©gative est considĂ©rĂ©e comme omise. Cette prĂ©cision indique un nombre minimal de chiffres Ă  faire apparaĂźtre lors des conversions d , i , o , u , x et X , le nombre de dĂ©cimales Ă  faire apparaĂźtre pour les conversions a , A , e , E , f et F , le nombre maximal de chiffres significatifs pour g et G et le nombre maximal de caractĂšres Ă  imprimer depuis une chaĂźne pour les conversions s et S .

Modificateur de longueur

Ici, une « conversion d’entier » correspond Ă  d , i , o , u , x ou X .

hh

La conversion d’entier suivante correspond à un signed char ou à un unsigned char , ou la conversion n suivante correspond à un pointeur sur un argument signed char .

h

La conversion d’entier suivante correspond à un short ou à un unsigned short , ou la conversion n suivante correspond à un pointeur sur un argument short .

l

(lettre l) La conversion d’entier suivante correspond Ă  un argument long ou unsigned long , ou la conversion n suivante correspond Ă  un pointeur sur un argument long , ou la conversion c suivante correspond Ă  un argument wint_t , ou encore la conversion s suivante correspond Ă  un pointeur sur un argument wchar_t . Lors de la conversion a , A , e , E , f , F , g ou G suivante, ce modificateur de longueur est ignorĂ© (C99 ; pas dans SUSv2).

ll

(lettre l en double). La conversion d’entier suivante correspond à un long long ou à un unsigned long long , ou la conversion n suivante correspond à un pointeur sur un long long .

q

Un synonyme de ll . Il s’agit d’une extension non standard, dĂ©rivĂ©e de BSD ; Ă©vitez son utilisation dans du nouveau code.

L

La conversion a , A , e , E , f , F , g ou G suivante correspond à un argument long double (C99 autorise %LF mais pas SUSv2).

j

La conversion d’entier suivante correspond à un argument intmax_t ou uintmax_t , ou la conversion n suivante correspond à un pointeur sur un argument intmax_t .

z

La conversion d’entier suivante correspond à un argument size_t ou ssize_t , ou la conversion n suivante correspond à un pointeur sur un argument size_t .

Z

Un synonyme non standard de z qui prĂ©cĂšde l’apparition de z . Ne pas l’utiliser dans du nouveau code.

t

La conversion d’entier suivante correspond à un argument ptrdiff_t , ou la conversion n suivante correspond à un pointeur sur un argument ptrdiff_t .

SUSv3 mentionne tous les modificateurs prĂ©cĂ©dents Ă  l’exception des extensions non standard. Les spĂ©cifications SUSv2 ne mentionnent que les modificateurs de longueur h (dans hd , hi , ho , hx , hX et hn ), l (dans ld , li , lo , lx , lX , ln , lc et ls ) et L (dans Le , LE , Lf , Lg et LG ).

En tant qu’extension non standard, l’implĂ©mentation GNU traite ll et L comme des synonymes de façon Ă  ce qu’il soit possible, par exemple, d’écrire llg (comme synonyme conforme aux standards de Lg ) et Ld (comme synonyme conforme aux standards de lld ). Une telle utilisation n’est pas portable.

Indicateurs de conversion

Un caractÚre indique le type de conversion à apporter. Les indicateurs de conversion et leurs significations sont :

d , i

L’argument int est converti en un chiffre dĂ©cimal signĂ©. La prĂ©cision, si elle est mentionnĂ©e, correspond au nombre minimal de chiffres qui doivent apparaĂźtre. Si la conversion fournit moins de chiffres, le rĂ©sultat est rempli Ă  gauche avec des zĂ©ros. Par dĂ©faut la prĂ©cision vaut 1 . Lorsque 0 est converti avec une prĂ©cision valant 0 , la sortie est vide.

o , u , x , X

L’argument unsigned int est converti en un chiffre octal non signĂ© ( o ), un chiffre dĂ©cimal non signĂ© ( u ) ou un chiffre hexadĂ©cimal non signĂ© ( x et X ). Les lettres abcdef sont utilisĂ©es pour les conversions avec x , les lettres ABCDEF sont utilisĂ©es pour les conversions avec X . La prĂ©cision, si elle est indiquĂ©e, donne un nombre minimal de chiffres Ă  faire apparaĂźtre. Si la valeur convertie nĂ©cessite moins de chiffres, elle est complĂ©tĂ©e Ă  gauche avec des zĂ©ros. La prĂ©cision par dĂ©faut vaut 1 . Lorsque 0 est converti avec une prĂ©cision valant 0 , la sortie est vide.

e , E

L’argument, de type double , est arrondi et prĂ©sentĂ© avec la notation scientifique [-]c . ccc e ±cc dans lequel se trouve un chiffre (qui n’est pas nul si l’argument n’est pas nul) avant le point, puis un nombre de dĂ©cimales Ă©gal Ă  la prĂ©cision demandĂ©e. Si la prĂ©cision n’est pas indiquĂ©e, l’affichage contiendra 6 dĂ©cimales. Si la prĂ©cision vaut zĂ©ro, il n’y a pas de point dĂ©cimal. Une conversion E utilise la lettre E (plutĂŽt que e ) pour introduire l’exposant. Celui-ci contient toujours au moins deux chiffres. Si la valeur affichĂ©e est nulle, son exposant est 00.

f , F

L’argument, de type double , est arrondi et prĂ©sentĂ© avec la notation classique [-]ccc . ccc, oĂč le nombre de dĂ©cimales est Ă©gal Ă  la prĂ©cision rĂ©clamĂ©e. Si la prĂ©cision n’est pas indiquĂ©e, l’affichage se fera avec 6 dĂ©cimales. Si la prĂ©cision vaut zĂ©ro, aucun point n’est affichĂ©. Lorsque le point est affichĂ©, il y a toujours au moins un chiffre devant.

SUSv2 ne mentionne pas F et dit qu’une reprĂ©sentation des chaĂźnes de caractĂšres pour l’infini ou NaN devrait ĂȘtre disponible. SUSv3 ajoute l’indicateur F . La norme C99 prĂ©cise « [-]inf » ou « [-]infinity » pour les infinis, et une chaĂźne commençant par « nan » pour NaN dans le cas d’une conversion f , et les chaĂźnes « [-]INF », « [-]INFINITY » ou « NAN* » pour une conversion F .

g , G

L’argument, de type double , est converti en style f ou e ( F ou E pour la conversion G ). La prĂ©cision indique le nombre de dĂ©cimales significatives. Si la prĂ©cision est absente, une valeur par dĂ©faut de 6 est utilisĂ©e. Si la prĂ©cision vaut 0 , elle est considĂ©rĂ©e comme valant 1 . La notation scientifique e est utilisĂ©e si l’exposant est infĂ©rieur Ă  -4 ou supĂ©rieur ou Ă©gal Ă  la prĂ©cision demandĂ©e. Les zĂ©ros en fin de partie dĂ©cimale sont supprimĂ©s. Un point dĂ©cimal n’est affichĂ© que s’il est suivi d’au moins un chiffre.

a , A

(C99, pas dans SUSv2, mais rajoutĂ© dans SUSv3). Pour la conversion a , l’argument de type double est transformĂ© en notation hexadĂ©cimale (avec les lettres abcdef) de forme [-] 0x h . hhhh p ±c ; pour la conversion A , le prĂ©fixe 0X , les lettres ABCDEF et le sĂ©parateur d’exposant P sont utilisĂ©s. Il y a un chiffre hexadĂ©cimal avant la virgule et le nombre de chiffres ensuite est Ă©gal Ă  la prĂ©cision. La prĂ©cision par dĂ©faut suffit pour une reprĂ©sentation exacte de la valeur, si une reprĂ©sentation exacte est possible en base 2. Sinon, elle est suffisamment grande pour distinguer les valeurs de type double . Le chiffre avant le point dĂ©cimal n’est pas spĂ©cifiĂ© pour les nombres non normalisĂ©s et il est non nul mais non spĂ©cifiĂ© pour les nombres normalisĂ©s.L’exposant contient toujours au moins un chiffre, et si la valeur est zĂ©ro, l’exposant est zĂ©ro.

c

S’il n’y a pas de modificateur l , l’argument, de type int , est converti en un unsigned char et le caractĂšre correspondant est affichĂ©. Si un modificateur l est prĂ©sent, l’argument de type wint_t (caractĂšre large) est converti en sĂ©quence multioctet par un appel Ă  wcrtomb (3), avec un Ă©tat de conversion dĂ©butant dans l’état initial. La chaĂźne multioctet rĂ©sultante est Ă©crite.

s

If no l modifier is present: the const char * argument is expected to be a pointer to an array of character type (pointer to a string). Characters from the array are written up to (but not including) a terminating null byte ('\0'); if a precision is specified, no more than the number specified are written. If a precision is given, no null byte need be present; if the precision is not specified, or is greater than the size of the array, the array must contain a terminating null byte.

Si un modificateur l est prĂ©sent, l’argument de type const wchar_t * est supposĂ© ĂȘtre un pointeur sur un tableau de caractĂšres larges. Les caractĂšres larges du tableau sont convertis en une sĂ©quence de caractĂšres multioctets (chacun par un appel de wcrtomb (3), avec un Ă©tat de conversion dans l’état initial avant le premier caractĂšre large), cela jusqu’au caractĂšre large NULL final compris. Les caractĂšres multioctets rĂ©sultants sont Ă©crits jusqu’à l’octet NULL final (non compris). Si une prĂ©cision est fournie, il n’y a pas plus d’octets Ă©crits que la prĂ©cision indiquĂ©e, mais aucun caractĂšre multioctet n’est Ă©crit partiellement. Remarquez que la prĂ©cision concerne le nombre d’ octets Ă©crits et non pas le nombre de caractĂšres larges ou de positions d’écran . Le tableau doit contenir un caractĂšre large NULL final, sauf si une prĂ©cision est indiquĂ©e et qu’il est suffisamment petit pour que le nombre d’octets Ă©crits le remplisse avant la fin du tableau.

C

(Ni dans C99, ni dans C11, mais dans SUSv2, SUSv3 et SUSv4). Synonyme de lc . Ne pas utiliser.

S

(Ni dans C99, ni dans C11, mais dans SUSv2, SUSv3 et SUSv4). Synonyme de ls . Ne pas utiliser.

p

L’argument pointeur, du type void * est affichĂ© en hexadĂ©cimal, comme avec %#x ou %#lx .

n

Le nombre de caractĂšres Ă©crits jusqu’à prĂ©sent est stockĂ© dans l’entier pointĂ© par l’argument correspondant. Cet argument doit ĂȘtre un int * ou une variante dont la taille correspond au modificateur de longueur d’entier optionnellement fourni. Aucun argument n’est converti (cet indicateur n’est pas pris en charge par la bibliothĂšque C Bionic). Le comportement n’est pas dĂ©fini si la spĂ©cification de conversion comporte un drapeau, une longueur de champ ou une prĂ©cision.

m

(extension glibc ; pris en charge par uClibc et musl) Affiche la sortie strerror(errno) (ou strerrorname_np(errno) sous une forme alternative). Aucun argument n’est requis.

%

Un caractĂšre « % » est Ă©crit. Il n’y a pas de conversion. L’indicateur complet est « %% ».

VALEUR RENVOYÉE

En cas de succĂšs, ces fonctions renvoient le nombre d’octets affichĂ©s (sans compter l’octet NULL final utilisĂ© pour terminer les sorties dans les chaĂźnes).

The functions snprintf () and vsnprintf () do not write more than size bytes (including the terminating null byte ('\0')). If the output was truncated due to this limit, then the return value is the number of characters (excluding the terminating null byte) which would have been written to the final string if enough space had been available. Thus, a return value of size or more means that the output was truncated. (See also below under CAVEATS.)

Si une erreur de sortie s’est produite, une valeur nĂ©gative est renvoyĂ©e.

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3873185-1.png

STANDARDS

fprintf ()
printf
()
sprintf
()
vprintf
()
vfprintf
()
vsprintf
()
snprintf
()
vsnprintf
()

C11, POSIX.1-2008.

dprintf ()
vdprintf
()

GNU, POSIX.1-2008.

HISTORIQUE

fprintf ()
printf
()
sprintf
()
vprintf
()
vfprintf
()
vsprintf
()

C89, POSIX.1-2001.

snprintf ()
vsnprintf
()

SUSv2, C99, POSIX.1-2001.

En ce qui concerne la valeur de retour de snprintf (), SUSv2 et C99 sont en contradiction : lorsque snprintf () est appelĂ©e avec un argument taille = 0 , SUSv2 prĂ©cise une valeur de retour indĂ©terminĂ©e, infĂ©rieure Ă  1, alors que C99 autorise chaĂźne Ă  ĂȘtre NULL dans ce cas, et renvoie (comme toujours) le nombre de caractĂšres qui auraient Ă©tĂ© Ă©crits si la chaĂźne de sortie avait Ă©tĂ© assez grande. Les spĂ©cifications de snprintf () dans POSIX.1-2001 et ses versions supĂ©rieures sont alignĂ©es avec C99.

dprintf ()
vdprintf
()

GNU, POSIX.1-2008.

La bibliothÚque glibc 2.1 ajoute les modificateurs de longueur hh , j , t et z et les caractÚres de conversion a et A .

La bibliothĂšque glibc 2.2 ajoute le caractĂšre de conversion F avec la sĂ©mantique C99 et le caractĂšre d’attribut I .

glibc 2.35 donne une signification Ă  la forme alternative ( # ) du spĂ©cificateur de conversion m , c’est-Ă -dire %#m .

AVERTISSEMENTS

Certains programmes reposent imprudemment sur du code comme :

sprintf(buf, "%s texte supplémentaire", buf);

pour ajouter du texte Ă  buf . Cependant, les normes indiquent explicitement que le rĂ©sultat n’est pas dĂ©fini si les tampons de source et de destination se recouvrent lors d’un appel Ă  sprintf (), snprintf (), vsprintf () et vsnprintf (). En fonction de la version de gcc (1) utilisĂ©e et des options de compilation, ces appels ne produiront pas le rĂ©sultat attendu.

L’implĂ©mentation des fonctions snprintf () et vsnprintf () de la glibc se conforme Ă  la norme C99 et se comporte comme dĂ©crit plus haut depuis la glibc 2.1. Jusqu’à la glibc 2.0.6, elles renvoyaient -1 si la sortie avait Ă©tĂ© tronquĂ©e.

BOGUES

Comme sprintf () et vsprintf () supposent des chaĂźnes de longueur arbitraire, le programme appelant doit s’assurer de ne pas dĂ©border l’espace d’adressage. C’est souvent difficile. Notez que la taille des chaĂźnes peut varier avec la localisation et ĂȘtre difficilement prĂ©visible. Il faut alors utiliser snprintf () ou vsnprintf () Ă  la place (ou encore asprintf (3) et vasprintf (3)).

Un code tel que printf( toto ); indique souvent un bogue, car toto peut contenir un caractĂšre « % ». Si toto vient d’une saisie non sĂ©curisĂ©e, il peut contenir %n , ce qui autorise printf () Ă  Ă©crire dans la mĂ©moire, et crĂ©e une faille de sĂ©curitĂ©.

EXEMPLES

Pour afficher Pi avec cinq décimales :

#include <math.h>
#include <stdio.h>
fprintf(stdout, "pi = %.5f\n", 4 * atan(1.0));

Pour afficher une date et une heure sous la forme « Sunday, July 3, 23:15 », oĂč jour_semaine et mois sont des pointeurs sur des chaĂźnes :

#include <stdio.h>
fprintf(stdout, "%s, %s %d, %.2d:%.2d\n",
weekday, month, day, hour, min);

De nombreux pays utilisent un format de date diffĂ©rent, comme jour-mois-annĂ©e. Une version internationale doit donc ĂȘtre capable d’afficher les arguments dans l’ordre indiquĂ© par le format :

#include <stdio.h>
fprintf(stdout, format,
jour_semaine, mois, jour, heure, min);

oĂč le format dĂ©pend de la localisation et peut permuter les arguments. Avec la valeur :

"%1$s, %3$d. %2$s, %4$d:%5$.2d\n"

On peut obtenir « Dimanche, 3 juillet, 23:15 ».

Pour allouer une chaßne de taille suffisante et écrire dedans (code correct aussi bien pour la glibc 2.0 que pour la glibc 2.1) :

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char *
make_message(const char *fmt, ...)
{
int n = 0;
size_t size = 0;
char *p = NULL;
va_list ap;
/* Determine required size. */
va_start(ap, fmt);
n = vsnprintf(p, size, fmt, ap);
va_end(ap);
if (n < 0)
return NULL;
size = (size_t) n + 1; /* One extra byte for '\0' */
p = malloc(size);
if (p == NULL)
return NULL;
va_start(ap, fmt);
n = vsnprintf(p, size, fmt, ap);
va_end(ap);
if (n < 0) {
free(p);
return NULL;
}
return p;
}

En cas de troncature dans les versions de la glibc avant la glibc 2.0.6, c’est traitĂ© comme une erreur au lieu d’ĂȘtre traitĂ© de façon Ă©lĂ©gante.

VOIR AUSSI

printf (1), asprintf (3), puts (3), scanf (3), setlocale (3), strfromd (3), wcrtomb (3), wprintf (3), locale (5)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Frédéric Hantrais <fhantrais@gmail.com>, Grégoire Scano <gregoire.scano@malloc.fr> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .