dwww Home | Manual pages | Find package

printf(3)                  Library Functions Manual                  printf(3)

NOM
       printf,  fprintf,  dprintf,  sprintf,  snprintf, vprintf, vfprintf, vd-
       printf, 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 stream,
                   const char *restrict format, ...);
       int dprintf(int fd,
                   const char *restrict format, ...);
       int sprintf(char *restrict str,
                   const char *restrict format, ...);
       int snprintf(char str[restrict .size], size_t size,
                   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);
       int vsprintf(char *restrict str,
                   const char *restrict format, va_list ap);
       int vsnprintf(char str[restrict .size], size_t size,
                   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 ca-
       ractè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 st-
       dio(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 vsn-
       printf()  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 arguments 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 NOTES.

   CHAÎNE DE FORMAT
       La chaîne de format est une chaîne de caractères, commençant et se ter-
       minant dans son état de décalage initial, si présent. La chaîne de for-
       mat est composée de zéro ou plus d'indicateurs : les  caractères  ordi-
       naires (différents de %), qui sont copiés sans modification sur la sor-
       tie, et les spécifications de conversion, qui chacune recherche  un  ou
       plus d’arguments suivants. Les spécifications de conversion sont intro-
       duites par le caractère % et se terminent par un indicateur de  conver-
       sion.  Entre  eux  peuvent se trouver (dans l'ordre), zéro ou plusieurs
       attributs, une valeur optionnelle de largeur minimale de champ, une va-
       leur optionnelle de précision et un éventuel modificateur de longueur.

       La syntaxe générale d'un format de conversion est :

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

       The  arguments must correspond properly (after type promotion) with the
       conversion specifier. By default, the arguments are used in  the  order
       given,  where  each  '*' (see Field width and Precision below) and each
       conversion specifier asks for the next argument (and it is an error  if
       insufficiently  many  arguments are given). One can also specify expli-
       citly which argument is taken, at each place where an argument  is  re-
       quired, by writing "%m$" instead of '%' and "*m$" instead of '*', where
       the decimal integer m denotes the position in the argument list of  the
       desired argument, indexed starting from 1. Thus,

           printf("%*d", width, num);

       et

           printf("%2$*1$d", width, num);

       are equivalent. The second style allows repeated references to the same
       argument. The C99 standard does not include the style using '$',  which
       comes  from  the  Single  UNIX Specification. If the style using '$' is
       used, it must be used throughout for all conversions taking an argument
       and  all  width  and precision arguments, but it may be mixed with "%%"
       formats, which do not consume an argument. There may be no gaps in  the
       numbers  of  arguments specified using '$'; for example, if arguments 1
       and 3 are specified, argument 2 must also be specified somewhere in the
       format string.

       For  some  numeric  conversions  a radix character ("decimal point") or
       thousands' grouping character is used. The actual  character  used  de-
       pends on the LC_NUMERIC part of the locale. (See setlocale(3).) The PO-
       SIX locale uses '.' as radix character, and does not  have  a  grouping
       character. Thus,

           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  locali-
       sation da_DK.

   Caractères d'attribut
       Le caractère % peut être éventuellement suivi par zéro ou plusieurs des
       attributs suivants :

       #      The value should be converted to  an  "alternate  form".  For  o
              conversions,  the  first  character of the output string is made
              zero (by prefixing a 0 if it was not zero already). For x and  X
              conversions, a nonzero result has the string "0x" (or "0X" for X
              conversions) prepended to it. For a, A, e, E, f,  F,  g,  and  G
              conversions,  the  result  will  always contain a decimal point,
              even if no digits follow it (normally, a decimal  point  appears
              in  the  results  of those conversions only if a digit follows).
              For g and G conversions, trailing zeros are not removed from the
              result  as  they  would otherwise be. For m, if errno contains a
              valid error code, the output of strerrorname_np(errno) is  prin-
              ted;  otherwise, the value stored in errno is printed as a deci-
              mal number. For other conversions, the result is undefined.

       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 attri-
              buts  0  et - apparaissent ensemble, l'attribut 0 est ignoré. Si
              une précision est fournie avec une conversion numérique  (d,  i,
              o,  u, x et X), l'attribut 0 est ignoré. Pour les autres conver-
              sions, le comportement est indéfini.

       -      Indique que la valeur convertie doit être justifiée sur  la  li-
              mite  gauche  du champ (par défaut elle l'est à droite). Les va-
              leurs 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  pro-
              duit  par une conversion signée. Par défaut, un signe n'est uti-
              lisé 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 :

       '      For decimal conversion (i, d, u, f, F, g, G)  the output  is  to
              be grouped with thousands' grouping characters if the locale in-
              formation indicates any. (See setlocale(3).) Note that many ver-
              sions  of gcc(1)  cannot parse this option and will issue a war-
              ning. (SUSv2 did not include %'F, but SUSv3 added it.) Note also
              that  the  default locale of a C program is "C" whose locale in-
              formation indicates no thousands' grouping character. Therefore,
              without  a  prior  call  to setlocale(3), no thousands' grouping
              characters will be printed.

       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
       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 spe-
       cify 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.

   Précision
       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,  res-
       pectively, 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 di-
       gits to appear for d, i, o, u, x, and X conversions, the number of  di-
       gits  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.

   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      (ell) A following integer conversion corresponds to  a  long  or
              unsigned  long argument, or a following n conversion corresponds
              to a pointer to a long argument, or  a  following  c  conversion
              corresponds  to  a  wint_t argument, or a following s conversion
              corresponds to a pointer to wchar_t argument. On a following  a,
              A, e, E, f, F, g, or G conversion, this length modifier is igno-
              red (C99; not in 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éri-
              vé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  int-
              max_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 ptr-
              diff_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 ex-
       tensions 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 si-
              gné  (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 no-
              tation  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éci-
              mal.  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 no-
              tation 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 dispo-
              nible.  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éci-
              males 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 utili-
              sé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  conver-
              sion  a,  l'argument  de  type double est transformé en notation
              hexadécimale (avec les lettres abcdef) de forme [-]0xh.hhhhp±d ;
              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.

       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 expec-
              ted  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 preci-
              sion 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  carac-
              tè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 in-
              diquée, mais aucun caractère multioctet n'est  écrit  partielle-
              ment.  Remarquez  que  la  précision concerne le nombre d'octets
              écrits et non pas le nombre de caractères larges ou de positions
              d'écrans. La chaîne doit contenir un caractère large NULL final,
              sauf si une précision est indiquée et  est  suffisamment  petite
              pour  que le nombre d'octets écrits la remplisse avant la fin de
              la chaîne.

       C      (Ni dans C99, ni dans C11, mais dans SUSv2, SUSv3 et SUSv4). Sy-
              nonyme de lc. Ne pas utiliser.

       S      (Ni dans C99, ni dans C11, mais dans SUSv2, SUSv3 et SUSv4). Sy-
              nonyme 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 modi-
              ficateur de longueur d'entier optionnellement fourni. Aucun  ar-
              gument  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 lon-
              gueur de champ ou une précision.

       m      (glibc extension; supported by uClibc and musl.) Print output of
              strerror(errno)  (or  strerrorname_np(errno)  in  the  alternate
              form). No argument is required.

       %      A '%' is written. No argument is converted. The complete conver-
              sion specification is '%%'.

VALEUR RENVOYÉE
       En cas de succès, ces fonctions renvoient le nombre de caractères affi-
       ché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 NOTES.)

       Si  une  erreur  de sortie s'est produite, une valeur négative est ren-
       voyée.

VERSIONS
       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 gives a meaning to the alternate form (#)  of the m  conver-
       sion specifier, that is %#m.

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

       ┌──────────────────────────────┬──────────────────────┬────────────────┐
       │InterfaceAttributValeur         │
       ├──────────────────────────────┼──────────────────────┼────────────────┤
       │printf(), fprintf(),          │ Sécurité des threads │ MT-Safe locale │
       │sprintf(), snprintf(),        │                      │                │
       │vprintf(), vfprintf(),        │                      │                │
       │vsprintf(), vsnprintf()       │                      │                │
       └──────────────────────────────┴──────────────────────┴────────────────┘

STANDARDS
       fprintf(),  printf(), sprintf(), snprintf(), vprintf(), vfprintf(), vs-
       printf(), vsnprintf(): POSIX.1-2001, POSIX.1-2008, C99.

       dprintf() et vdprintf() sont originellement des extensions  GNU.  Elles
       ont été standardisées dans POSIX.1-2008.

       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  sn-
       printf()  dans  POSIX.1-2001  et ses versions supérieures sont alignées
       avec C99.

NOTES
       Certains programmes reposent imprudemment sur du code comme :

           sprintf(buf, "%s some further text", buf);

       pour ajouter du texte à buf. Cependant, les normes indiquent explicite-
       ment  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(),  vs-
       printf()  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.

       The  glibc  implementation of the functions snprintf()  and vsnprintf()
       conforms to the C99 standard, that  is,  behaves  as  described  above,
       since  glibc 2.1. Until glibc 2.0.6, they would return -1 when the out-
       put was truncated.

BOGUES
       Comme sprintf() et vsprintf() ne font pas de suppositions sur  la  lon-
       gueur  des  chaînes, le programme appelant doit s'assurer de ne pas dé-
       border l'espace d'adressage. C'est souvent difficile. Notez que la lon-
       gueur  des  chaînes peut varier avec la localisation et être difficile-
       ment 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",
                   jour_semaine, mois, jour, heure, minute);

       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"

       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;

           /* Déterminer la taille requise. */

           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;
       }

       If  truncation  occurs  in glibc versions prior to glibc 2.0.6, this is
       treated as an error instead of being handled gracefully.

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 Chris-
       tophe Blaess <https://www.blaess.fr/christophe/>, Stéphan  Rafin  <ste-
       phan.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.cou-
       lon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>,  Thomas  Huriaux
       <thomas.huriaux@gmail.com>,  Nicolas François <nicolas.francois@centra-
       liens.net>, Florentin Duneau <fduneau@gmail.com>, Simon  Paillard  <si-
       mon.paillard@resel.enst-bretagne.fr>,    Denis   Barbier   <barbier@de-
       bian.org>, David Prévot <david@tilapin.org>, Frédéric  Hantrais  <fhan-
       trais@gmail.com> et Grégoire Scano <gregoire.scano@malloc.fr>

       Cette traduction est une documentation libre ; veuillez vous reporter à
       la       GNU       General       Public        License        version 3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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⟩.

Pages du manuel de Linux 6.03   5 février 2023                       printf(3)

Generated by dwww version 1.15 on Sat Jun 29 00:40:54 CEST 2024.