Bibliothèque C standard
(libc, -lc)
#include <stdio.h>
int printf(const char *restrict format, ...);
int fprintf(FILE *restrict stream,
const char *restrict format, ...);
int dprintf(int fd,
const char *restrict format, ...);
int vprintf(const char *restrict format, va_list ap);
int vfprintf(FILE *restrict stream,
const char *restrict format, va_list ap);
int vdprintf(int fd,
const char *restrict format, va_list ap);
dprintf(), vdprintf() :
Depuis la glibc 2.10 :
_POSIX_C_SOURCE >= 200809L
Avant la glibc 2.10 :
_GNU_SOURCE
The functions in the printf() family produce output
according to a format as described below. The functions
printf() and vprintf() write output to stdout, the
standard output stream; fprintf() and vfprintf() write output
to the given output stream.
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 vprintf(), vfprintf(),
vdprintf() are equivalent to the functions printf(),
fprintf(), dprintf(), respectively, except that they are
called with a va_list instead of a variable number of arguments.
These functions do not call the va_end macro. Because they invoke the
va_arg macro, the value of ap is undefined after the call. See
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)).
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 :
%[argument$][flags][width][.precision][length modifier]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.
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.
The five flag characters above are defined in the C99 standard.
POSIX specifies one further flag character.
- '
- For decimal conversion (i, d, u, f, F,
g, G) the output is to be grouped with thousands' grouping
characters as a non-monetary quantity. Misleadingly, this isn't
necessarily every thousand: for example Karbi ("mjw_IN"), groups
its digits into 3 once, then 2 repeatedly. Compare locale(7)
grouping and thousands_sep, contrast with
mon_grouping/mon_thousands_sep and strfmon(3). This
is a no-op in the default "C" locale.
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 »).
An optional decimal digit string (with nonzero first digit)
specifying a minimum field width. If the converted value has fewer
characters than the field width, it will be padded with spaces on the left
(or right, if the left-adjustment flag has been given). Instead of a decimal
digit string one may write "*" or "*m$" (for some
decimal integer m) to specify that the field width is given in the
next argument, or in the m-th argument, respectively, which must be
of type int. A negative field width is taken as a '-' flag followed
by a positive field width. In no case does a nonexistent or small field
width cause truncation of a field; if the result of a conversion is wider
than the field width, the field is expanded to contain the conversion
result.
An optional precision, in the form of a period ('.') followed by
an optional decimal digit string. Instead of a decimal digit string one may
write "*" or "*m$" (for some decimal integer m)
to specify that the precision is given in the next argument, or in the
m-th argument, respectively, which must be of type int. If the
precision is given as just '.', the precision is taken to be zero. A
negative precision is taken as if the precision were omitted. This gives the
minimum number of digits to appear for d, i, o,
u, x, and X conversions, the number of digits to appear
after the radix character for a, A, e, E,
f, and F conversions, the maximum number of significant digits
for g and G conversions, or the maximum number of characters
to be printed from a string for s and S conversions.
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.
- wN
- A following integer conversion corresponds to an integer of a width of
N bits (C23).
- 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.
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.ccce±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; not in SUSv2, but added in SUSv3) For a conversion, the
double argument is converted to hexadecimal notation (using the
letters abcdef) in the style [-]0xh.hhhhp±d;
for A conversion the prefix 0X, the letters ABCDEF, and the
exponent separator P is used. There is one hexadecimal digit before
the radix point, and the number of digits after it is equal to the
precision. The default precision suffices for an exact representation of
the value if an exact representation in base 2 exists and otherwise is
sufficiently large to distinguish values of type double. The digit
before the radix point is unspecified for nonnormalized numbers, and
nonzero but otherwise unspecified for normalized numbers. The exponent,
d, is the appropriate exponent of 2 expressed as a decimal integer;
it always contains at least one digit; if the value is zero, the exponent
is 0.
- 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
- (glibc extension; supported by uClibc and musl, and on Android from API
level 29.) Print output of strerror(errno) (or
strerrorname_np(errno) in the alternate form). No argument is
required.
- %
- Un caractère « % » est écrit. Il
n'y a pas de conversion. L'indicateur complet est
« %% ».
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).
On error, a negative value is returned, and errno is set to
indicate the error.
See write(2) and putwc(3). In addition, the
following error may occur:
- EOVERFLOW
- The value to be returned is greater than INT_MAX.
The dprintf() function may fail additionally if:
- EBADF
- The fd argument is not a valid file descriptor.
Pour une explication des termes utilisés dans cette
section, consulter attributes(7).
| Interface |
Attribut |
Valeur |
| printf(), fprintf(), vprintf(),
vfprintf() |
Sécurité des threads |
MT-Safe locale |
- fprintf()
- printf()
- vprintf()
- vfprintf()
- C89, POSIX.1-2001.
- dprintf()
- vdprintf()
- GNU, POSIX.1-2008.
Issue 4 of the X/Open Portability Guide (SUSv1, 1994) adds
'.
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.
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é.
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"
one might obtain "Sonntag, 3. Juli, 10:02".
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.