Provided by: manpages-fr-dev_4.21.0-2_all bug

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

       Les  fonctions  snprintf()  et  vsnprintf()  écrivent  au  plus  taille octets (octet NULL final (« \0 »)
       compris) dans chaîne.

       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 NOTES.

   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  numérique  (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.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, 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 [-]0xh.hhhhp±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      S'il n'y a pas de modificateur l, l'argument de type const char * est supposé être un pointeur sur
              un  tableau de caractères (pointeur sur une chaîne). Les caractères du tableau sont écrits jusqu'à
              l'octet NULL final (« \0 »), non compris. Si  une  précision  est  indiquée,  seul  ce  nombre  de
              caractères  est  écrit.  Si  une  précision  est  fournie, il n'y a pas besoin d'octet NULL. Si la
              précision n'est pas donnée, ou si elle est supérieure à la longueur du tableau, l'octet NULL final
              est nécessaire.

              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 de caractères affichés  (sans  compter  l'octet  NULL
       final utilisé pour terminer les sorties dans les chaînes).

       Les  fonctions  snprintf()  et  vsnprintf()  n'écrivent pas plus de taille octets (y compris l'octet NULL
       final — « \0 »). Si la sortie a été tronquée à cause de la limite, la valeur de retour est le  nombre  de
       caractères  (octet  NULL  final  non  compris)  qui  auraient  été  écrits dans la chaîne s'il y avait eu
       suffisamment de place. Ainsi, une valeur de retour taille ou plus signifie que la sortie a  été  tronquée
       (consultez aussi la section NOTES plus bas).

       Si une erreur de sortie s'est produite, une valeur négative est renvoyé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  donne  une  signification  à  la  forme  alternative  (#)  du  spécificateur de conversion m,
       c'est-à-dire %#m.

ATTRIBUTS

       Pour une explication des termes utilisés dans cette section, consulter attributes(7).
       ┌───────────────────────────────────────────────────────────────┬──────────────────────┬────────────────┐
       │ InterfaceAttributValeur         │
       ├───────────────────────────────────────────────────────────────┼──────────────────────┼────────────────┤
       │ printf(), fprintf(), sprintf(), snprintf(), vprintf(),        │ Sécurité des threads │ MT-Safe locale │
       │ vfprintf(), vsprintf(), vsnprintf()                           │                      │                │
       └───────────────────────────────────────────────────────────────┴──────────────────────┴────────────────┘

STANDARDS

       fprintf(),  printf(),  sprintf(),  snprintf(),  vprintf(),  vfprintf(),  vsprintf(),  vsnprintf() :   PO‐
       SIX.1-2001, POSIX.1-2008, C99.

       dprintf()  et  vdprintf()  sont  originellement  des  extensions  GNU. Elles ont été normalisées dans PO‐
       SIX.1-2008.

       En ce qui concerne la valeur de retour de snprintf(), SUSv2 et C99 sont en  contradiction :  lorsque  sn‐
       printf()  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.

NOTES

       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 sn‐
       printf() 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 to‐
       to 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;    /* Un octet supplémentaire pour « \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 <tvi‐
       gnaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe  Guérard  <fe‐
       vrier@tigreraye.org>,  Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@de‐
       bian.org>,  Thomas  Huriaux  <thomas.huriaux@gmail.com>,   Nicolas   François   <nicolas.francois@centra‐
       liens.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  <fhan‐
       trais@gmail.com>,  Grégoire  Scano  <gregoire.scano@malloc.fr>  et  Jean-Pierre  Giraud   <jean-pierregi‐
       raud@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 à  de‐
       bian-l10n-french@lists.debian.org.

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