Provided by: manpages-fr-dev_3.32d0.2p4-1_all bug

NOM

       printf,   fprintf,  sprintf,  snprintf,  vprintf,  vfprintf,  vsprintf,
       vsnprintf - Formatage des sorties

SYNOPSIS

       #include <stdio.h>

       int printf(const char *format, ...);
       int fprintf(FILE *stream, const char *format, ...);
       int sprintf(char *str, const char *format, ...);
       int snprintf(char *str, size_t size, const char *format, ...);

       #include <stdarg.h>

       int vprintf(const char *format, va_list ap);
       int vfprintf(FILE *stream, const char *format, va_list ap);
       int vsprintf(char *str, const char *format, va_list ap);
       int vsnprintf(char *str, size_t size, const char *format, va_list ap);

   Exigences de macros de test de fonctionnalites  pour  la  glibc  (consultez
   feature_test_macros(7)) :

       snprintf(), vsnprintf() :
           _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _ISOC99_SOURCE ||
           _POSIX_C_SOURCE >= 200112L
           ou cc -std=c99

DESCRIPTION

       Les fonctions de la famille printf() produisent des sorties  en  accord
       avec  le  format  decrit  plus bas. Les fonctions printf() et vprintf()
       ecrivent leur sortie sur stdout, le flux de sortie standard.  fprintf()
       et   vfprintf()   ecrivent  sur  le  flux  stream  indique.  sprintf(),
       snprintf(), vsprintf() et vsnprintf() ecrivent leurs  sorties  dans  la
       chaine de caracteres str.

       Les  fonctions  snprintf()  et vsnprintf() ecrivent au plus size octets
       (caractere nul (<< \0 >>) final compris) dans str.

       Les  fonctions  vprintf(),  vfprintf(),  vsprintf(),  vsnprintf()  sont
       equivalentes  aux  fonctions printf(), fprintf(), sprintf(), snprintf()
       respectivement, mais elles emploient un tableau va_list a la place d'un
       nombre  variable  d'arguments.  Ces  fonctions n'appellent pas la macro
       va_end. Du fait qu'elles appelent la macro  va_arg,  la  valeur  de  ap
       n'est pas definie apres l'appel. Consultez stdarg(3).

       Ces  huit  fonctions creent leurs sorties sous le controle d'une chaine
       de format qui indique les conversions a apporter aux arguments suivants
       (ou   accessibles  a  travers  les  arguments  de  taille  variable  de
       stdarg(3)).

       C99 et POSIX.1-2001 specifient que les resultats ne sont pas definis si
       un  appel a sprintf(), snprintf(), vsprintf() ou vsnprintf() causait la
       copie entre des objets qui se chevauchent (par exemple, si  le  tableau
       de  la  chaine  cible et un des parametres d'entree se trouvent dans le
       meme tampon). Consultez la section NOTES.

   VALEUR RENVOY'EE
       En cas de succes, ces  fonctions  renvoient  le  nombre  de  caracteres
       affiches  (sans  compter  le caractere nul de fin utilise pour terminer
       les sorties dans les chaines).

       Ces fonctions renvoient le nombre de caracteres imprimes, sans  compter
       le  caractere  nul  << \0 >>  final  dans  les  chaines.  Les fonctions
       snprintf() et vsnprintf() n'ecrivent pas plus de size octets (y compris
       le  << \0 >>  final). Si la sortie a ete tronquee a cause de la limite,
       la valeur de retour est le  nombre  de  caracteres  (sans  le  << \0 >>
       final)  qui  auraient  ete  ecrits  dans  la  chaine  s'il  y  avait eu
       suffisamment de place.  Ainsi,  une  valeur  de  retour  size  ou  plus
       signifie que la sortie a ete tronquee (voir aussi la section NOTES plus
       bas).

       Si une erreur  de  sortie  s'est  produite,  une  valeur  negative  est
       renvoyee.

   CHA^INE DE FORMAT
       Le  format  de  conversion  est  indique  par une chaine de caracteres,
       commencant et se terminant dans son etat de decalage initial. La chaine
       de  format  est  composee  d'indicateurs :  les  caracteres  ordinaires
       (differents de %), qui sont copies sans modification sur la sortie,  et
       les specifications de conversion, qui sont mises en correspondance avec
       les  arguments  suivants.  Les  specifications   de   conversion   sont
       introduites  par  le  caractere %, et se terminent par un indicateur de
       conversion. Entre eux  peuvent  se  trouver  (dans  l'ordre),  zero  ou
       plusieurs  attributs,  une  valeur  optionnelle  de  largeur minimal de
       champ, une valeur optionnelle de pr'ecision, et un eventuel modificateur
       de longueur.

       Les  arguments  doivent correspondre correctement (apres les promotions
       de types) avec les indicateurs de conversion. Par defaut les  arguments
       sont  pris dans l'ordre indique, ou chaque << * >> et chaque indicateur
       de conversion reclament un nouvel argument  (et  ou  l'insuffisance  en
       arguments  est  une  erreur). On peut aussi preciser explicitement quel
       argument prendre, en ecrivant, a chaque conversion, << %m$ >>  au  lieu
       de << % >>, et << *m$ >> au lieu de << * >>. L'entier decimal m indique
       la position dans la liste d'arguments,  l'indexation  commencant  a  1.
       Ainsi,

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

       et

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

       sont  equivalents. La seconde notation permet de repeter plusieurs fois
       le meme argument. Le standard C99 n'autorise  pas  le  style  utilisant
       << $ >>,  qui provient des Specifications Single UNIX. Si le style avec
       << $ >> est utilise, il faut l'employer pour toutes conversions prenant
       un  argument,  et  pour  tous les arguments de largeur et de precision,
       mais on peut le melanger avec des formats << %% >>  qui  ne  consomment
       pas  d'arguments.  Il ne doit pas y avoir de sauts dans les numeros des
       arguments specifies avec << $ >>. Par exemple, si les arguments 1 et  3
       sont  specifies,  l'argument  2  doit aussi etre mentionne quelque part
       dans la chaine de format.

       Pour certaines  conversions  numeriques,  un  caractere  de  separation
       decimale  (le  point  par defaut) est utilise, ainsi qu'un caractere de
       regroupement par milliers. Les veritables caracteres  dependent  de  la
       localisation  LC_NUMERIC.  La  localisation POSIX utilise << . >> comme
       separateur decimal, et n'a pas de caractere 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`ERE D'ATTRIBUT
       Le caractere % peut etre  eventuellement  suivi  par  un  ou  plusieurs
       attributs suivants :

       #      indique  que  la  valeur doit etre convertie en une autre forme.
              Pour la conversion o le premier caractere de la chaine de sortie
              vaudra  zero  (en  ajoutant un prefixe 0 si ce n'est pas deja un
              zero). Pour les conversions x et X une valeur non  nulle  recoit
              le  prefixe << 0x >> (ou << 0X >> pour l'indicateur X). Pour les
              conversions a, A, e, E, f, F, g, et  G  le  resultat  contiendra
              toujours  un  point  decimal  meme  si  aucun chiffre ne le suit
              (normalement,  un  point  decimal   n'est   present   avec   ces
              conversions   que   si  des  decimales  le  suivent).  Pour  les
              conversions g et G les zeros  en  tete  ne  sont  pas  elimines,
              contrairement   au   comportement   habituel.  Pour  les  autres
              conversions, cet attribut n'a pas d'effet.

       0      indique le remplissage avec des zeros. Pour les  conversions  d,
              i,  o,  u,  x,  X,  a,  A,  e,  E,  f, F, g, et G, la valeur est
              completee a gauche avec des zeros plutot qu'avec des espaces. Si
              les  attributs  0  et  - apparaissent ensemble, l'attribut 0 est
              ignore.  Si  une  precision  est  fournie  avec  une  conversion
              numerique  (d,  i, o, u, x, et X), l'attribut 0 est ignore. Pour
              les autres conversions, le comportement est indefini.

       -      indique que la valeur doit etre justifiee sur la  limite  gauche
              du  champ  (par  defaut  elle  l'est  a  droite).  Sauf  pour la
              conversion n, les valeurs  sont  completees  a  droite  par  des
              espaces,  plutot  qu'a  gauche  par  des zeros ou des blancs. Un
              attribut - surcharge un attribut 0 si les deux sont fournis.

       ' '    (un espace) indique qu'un  espace  doit  etre  laisse  avant  un
              nombre  positif  (ou une chaine vide) produit par une conversion
              signee

       +      Un signe (+ ou -) doit toujours etre  imprime  avant  un  nombre
              produit  par  une  conversion signee. Par defaut, un signe n'est
              utilise que pour des valeurs negatives. Un attribut +  surcharge
              un attribut << espace >> si les deux sont fournis.

       Les cinq caracteres d'attributs ci-dessus sont definis dans le standard
       C, les specifications SUSv2 en ajoute un :

       '      Pour les conversions decimales (i, d, u, f, F, g, G) indique que
              les  chiffres  d'un  argument numerique doivent etre groupes par
              milliers en  fonction  de  la  localisation.  Remarquez  que  de
              nombreuses  versions  de  gcc(1) n'acceptent pas cet attribut et
              declencheront un avertissement  (warning).  SUSv2  n'inclue  pas
              %'F.

       La glibc 2.2 ajoute un caractere d'attribut supplementaire.

       I      Pour  les  conversions decimales (i, d, u) la sortie emploie les
              chiffres alternatifs  de  la  localisation  s'il  y  en  a.  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 commencant pas par un zero,  peut  indiquer  une
       largeur  minimale  de  champ.  Si  la  valeur convertie occupe moins de
       caracteres que cette largeur, elle sera completee  par  des  espaces  a
       gauche  (ou a droite si l'attribut d'alignement a gauche a ete fourni).
       A la place de la chaine representant le nombre decimal, on peut  ecrire
       << * >>  ou  << *m$ >> (m etant entier) pour indiquer que la largeur du
       champ est fournie dans l'argument suivant, ou dans le m-ieme  argument,
       respectivement.  L'argument  fournissant  la  largeur doit etre de type
       int. Une largeur negative est considere  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  resultat  de  la
       conversion  est plus grand que la largeur indiquee, le champ est elargi
       pour contenir le resultat.

   PR'ECISION
       Une precision eventuelle, sous la forme d'un point (<< . >>) suivi  par
       un  nombre.  A la place de la chaine representant le nombre decimal, on
       peut ecrire << * >> ou << *m$ >> (m etant entier) pour indiquer que  la
       precision  est  fournie  dans  l'argument  suivant,  ou  dans le m-ieme
       argument, respectivement. L'argument fournissant la precision doit etre
       de  type  int. Si la precision ne contient que le caractere << . >>, ou
       une valeur negative, elle est consideree comme nulle.  Cette  precision
       indique  un  nombre  minimal  de  chiffres  a faire apparaitre lors des
       conversions d, i, o, u, x,  et  X,  le  nombre  de  decimales  a  faire
       apparaitre  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
       caracteres a imprimer depuis une chaine pour les conversions s et S.

   MODIFICATEUR DE LONGUEUR
       Ici, une conversion entiere correspond a d, i, o, u, x ou X.

       hh     La  conversion  entiere  suivante correspond a un signed char ou
              unsigned char, ou la  conversion  n  suivante  correspond  a  un
              argument pointeur sur un signed char.

       h      La  conversion  entiere  suivante  correspond  a un short int ou
              unsigned short int, ou la conversion n suivante correspond a  un
              argument pointeur sur un short int.

       l      (elle)  La  conversion entiere suivante correspond a un long int
              ou unsigned long int, ou la conversion n suivante  correspond  a
              un  pointeur  sur  un  long  int,  ou  la  conversion c suivante
              correspond a un argument  wint_t,  ou  encore  la  conversion  s
              suivante correspond a un pointeur sur un wchar_t.

       ll     (elle-elle)  La conversion entiere suivante correspond a un long
              long int, ou unsigned long long int, ou la conversion n suivante
              correspond a un pointeur sur un long long int.

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

       q      (<< quad >> BSD 4.4  et  Linux  sous  libc5  seulement,  ne  pas
              utiliser) Il s'agit d'un synonyme pour ll.

       j      La conversion entiere suivante correspond a un argument intmax_t
              ou uintmax_t.

       z      La conversion entiere suivante correspond a un  argument  size_t
              ou  ssize_t (la bibliotheque libc5 de Linux proposait l'argument
              Z pour cela, ne pas utiliser).

       t      La  conversion  entiere  suivante  correspond  a   un   argument
              ptrdiff_t.

       Les  specifications  SUSv2  ne  mentionnent  que  les  modificateurs de
       longueur h (dans hd, hi, ho, hx, hX, hn), l (dans ld, li, lo,  lx,  lX,
       ln, lc, ls) et L (dans Le, LE, Lf, Lg, LG).

   INDICATEUR DE CONVERSION
       Un  caractere indique le type de conversion a apporter. Les indicateurs
       de conversion, et leurs significations sont :

       d, i   L'argument int est converti en  un  chiffre  decimal  signe.  La
              precision,  si elle est mentionnee, correspond au nombre minimal
              de chiffres qui doivent apparaitre.  Si  la  conversion  fournit
              moins  de  chiffres,  le  resultat  est rempli a gauche avec des
              zeros. Par defaut la precision vaut 1. Lorsque  0  est  converti
              avec une precision valant 0, la sortie est vide.

       o, u, x, X
              L'argument  unsigned  int  est  converti en un chiffre octal non
              signe  (o),  un  chiffre  decimal  non  signe  (u),  un  chiffre
              hexadecimal  non  signe  (x  et  X).  Les  lettres  abcdef  sont
              utilisees pour les conversions avec x, les lettres  ABCDEF  sont
              utilisees pour les conversions avec X. La precision, si elle est
              indiquee,  donne  un  nombre  minimal  de   chiffres   a   faire
              apparaitre.  Si la valeur convertie necessite moins de chiffres,
              elle est completee a gauche avec des  zeros.  La  precision  par
              defaut  vaut 1. Lorsque 0 est converti avec une precision valant
              0, la sortie est vide.

       e, E   L'argument reel, de type double, est arrondi et presente avec la
              notation  scientifique  [-]c.ccce+-cc  dans  lequel se trouve un
              chiffre avant le point, puis un nombre de decimales  egal  a  la
              precision   demandee.   Si  la  precision  n'est  pas  indiquee,
              l'affichage contiendra 6 decimales. Si la precision  vaut  zero,
              il  n'y  a  pas  de  point  decimal. Une conversion E utilise la
              lettre E (plutot que e)  pour  introduire  l'exposant.  Celui-ci
              contient  toujours au moins deux chiffres. Si la valeur affichee
              est nulle, son exposant est 00.

       f, F   L'argument reel, de type double, est arrondi, et  presente  avec
              la  notation classique [-]ccc.ccc, ou le nombre de decimales est
              egal  a  la  precision  reclamee.  Si  la  precision  n'est  pas
              indiquee,  l'affichage se fera avec 6 decimales. Si la precision
              vaut zero, aucun point  n'est  affiche.  Lorsque  le  point  est
              affiche, il y a toujours au moins un chiffre devant.

              SUSv2  ne  mentionne  pas  F  et  dit qu'il existe une chaine de
              caracteres representant l'infini ou NaN. Le standard C99 precise
              << [-]inf >>  ou  << [-]infinity >>  pour  les  infinis,  et une
              chaine commencant par << nan >>  pour  NaN  dans  le  cas  d'une
              conversion  f,  et  les  chaines  << [-]INF >> << [-]INFINITY >>
              << NAN* >> pour une conversion F.

       g, G   L'argument reel, de type double, est converti en style  f  ou  e
              (ou  F ou E pour la conversion G) La precision indique le nombre
              de decimales significatives. Si la precision  est  absente,  une
              valeur  par  defaut  de  6 est utilisee. Si la precision vaut 0,
              elle est consideree comme valant 1. La notation  scientifique  e
              est  utilisee  si  l'exposant est inferieur a -4 ou superieur ou
              egal a la  precision  demandee.  Les  zeros  en  fin  de  partie
              decimale sont supprimes. Un point decimal n'est affiche que s'il
              est suivi d'au moins un chiffre.

       a, A   (C99 mais pas SUSv2). Pour la conversion a, l'argument  de  type
              double est transforme en notation hexadecimale (avec les lettres
              abcdef) dans le style [-]0xh.hhhhp+-d; Pour la conversion A,  le
              prefixe  0X,  les  lettres  ABCDEF et le separateur d'exposant P
              sont utilises. Il y a un chiffre hexadecimal avant  la  virgule,
              et  le  nombre  de  chiffres ensuite est egal a la precision. La
              precision par defaut suffit pour une representation exacte de la
              valeur,  si  une  representation  exacte est possible en base 2.
              Sinon, elle est suffisamment grande pour distinguer les  valeurs
              de  type  double.  Le  chiffre  avant le point decimal n'est pas
              specifie pour les nombres non normalises, et il est non nul pour
              les nombres normalises.

       c      S'il  n'y  a  pas  de modificateur l, l'argument entier, de type
              int,  est  converti  en  un  unsigned  char,  et  le   caractere
              correspondant  est  affiche.  Si  un modificateur l est present,
              l'argument de type wint_t  (caractere  large)  est  converti  en
              sequence  multioctet  par un appel a wcrtomb(3), avec un etat de
              conversion debutant dans l'etat initial.  La  chaine  multioctet
              resultante est ecrite.

       s      S'il  n'y a pas de modificateur l, l'argument de type const char
              * est suppose etre un pointeur  sur  un  tableau  de  caracteres
              (pointeur sur une chaine). Les caracteres du tableau sont ecrits
              jusqu'a l'octet  nul  (<< \0 >>)  final,  non  compris.  Si  une
              precision  est  indiquee,  seul  ce  nombre  de  caracteres sont
              ecrits. Si une precision est fournie, il n'y  a  pas  besoin  de
              caractere  nul. Si la precision n'est pas donnee, ou si elle est
              superieure a la longueur de la chaine, le  caractere  nul  final
              est necessaire.

              Si  un  modificateur  l  est  present,  l'argument de type const
              wchar_t * est  suppose  etre  un  pointeur  sur  un  tableau  de
              caracteres   larges.  Les  caracteres  larges  du  tableau  sont
              convertis en une sequence de caracteres multioctet  (chacun  par
              un  appel  de wcrtomb(3), avec un etat de conversion dans l'etat
              initial  avant  le  premier  caractere  large),  ceci   jusqu'au
              caractere  large  nul  final  compris. Les caracteres multioctet
              resultants sont ecris jusqu'a l'octet nul final  (non  compris).
              Si  une precision est fournie, il n'y a pas plus d'octets ecrits
              que la precision indiquee, mais aucun caractere multioctet n'est
              ecrit  partiellement.  Remarquez  que  la  precision concerne le
              nombre d'octets ecrits, et  non  pas  le  nombre  de  caract`eres
              larges  ou  de  positions  d''ecrans.  La chaine doit contenir un
              caractere large nul final, sauf si une precision  est  indiquee,
              suffisamment  petite  pour  que  le  nombre  d'octets  ecrits la
              remplisse avant la fin de la chaine.

       C      (dans SUSv2 mais pas dans C99) Synonyme de lc. Ne pas utiliser.

       S      (dans SUSv2 mais pas dans C99) Synonyme de ls. Ne pas utiliser.

       p      L'argument pointeur, du type void * est affiche en  hexadecimal,
              comme avec %#x ou %#lx.

       n      Le  nombre  de  caracteres  deja ecrits est stocke dans l'entier
              indique par l'argument pointeur de type int  *.  Aucun  argument
              n'est converti.

       m      (extension  glibc)  Affiche  la  sortie  strerror(errno).  Aucun
              argument n'est requis.

       %      Un caractere << % >> est ecrit. Il  n'y  a  pas  de  conversion.
              L'indicateur complet est << %% >>.

CONFORMIT'E

       Les  fonctions fprintf(), printf(), sprintf(), vprintf(), vfprintf() et
       vsprintf() sont conformes a C89 et C99.  Les  fonctions  snprintf()  et
       vsnprintf() sont conformes a C99.

       En ce qui concerne la valeur de retour de snprintf(), SUSv2 et C99 sont
       en contradiction : lorsque snprintf()  est  appelee  avec  un  argument
       size=0 SUSv2 precise une valeur de retour indeterminee, inferieure a 1,
       alors que C99 autorise str a etre NULL  dans  ce  cas,  et  reclame  en
       valeur  de retour (comme toujours) le nombre de caracteres qui auraient
       ete ecrits si la chaine de sortie avait ete assez grande.

       La bibliotheque libc4 de Linux connaissait les 5 attributs standards du
       C.  Elle  connaissait  les  modificateurs  de  longueur  h, l, L et les
       conversions c, d, e, E, f, F, g, G, i, n, o, p, s, u,  x  et  X,  ou  F
       etait  synonyme de f. De plus, elle acceptait D, O et U comme synonymes
       de ld, lo et lu (ce qui causa de serieux bogues par la suite lorsque le
       support  de  %D  disparut).  Il  n'y  avait  pas  de separateur decimal
       dependant de la localisation, pas de separateur des  milliers,  pas  de
       NaN ou d'infinis, et pas de << %m$ >> ni << *m$ >>.

       La bibliotheque libc5 de Linux connaissait les 5 attributs standards C,
       l'attribut << ' >>,  la  localisation,  << %m$ >>  et  << *m$ >>.  Elle
       connaissait  les  modificateurs  de  longueur  h,  l,  L,  Z et q, mais
       acceptait L et q pour les long double et les long long int (ce qui  est
       un  bogue).  Elle  ne reconnaissait plus F, D, O et U, mais ajoutait le
       caractere de conversion m, qui affiche strerror(errno).

       La bibliotheque glibc 2.0 ajouta les caracteres de conversion C et S.

       La bibliotheque glibc 2.1 ajouta les modificateurs de longueur hh, t et
       z, et les caracteres de conversion a et A.

       La  bibliotheque glibc 2.2. ajouta le caractere de conversion F avec la
       semantique C99, et le caractere d'attribut I.

NOTES

       Certains programmes reposent imprudemment sur du code comme :

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

       pour  ajouter  du  texte  a  buf.  Cependant,  les   normes   indiquent
       explicitement que le resultat n'est pas defini si les tampons de source
       et  de  destination  se  recouvrent  lors  d'un  appel   a   sprintf(),
       snprintf(),  vsprintf()  et  vsnprintf().  En fonction de la version de
       gcc(1) utilisee et des options de compilation, ces appels ne produiront
       pas le resultat attendu.

       L'implementation des fonctions snprintf() et vsnprintf() de la glibc se
       conforme au standard C99, et se comporte comme decrit plus haut  depuis
       la glibc 2.1. Jusqu'a la glibc 2.0.6, elles renvoyaient -1 si la sortie
       avait ete tronquee.

BOGUES

       Comme sprintf() et vsprintf()  ne  font  pas  de  suppositions  sur  la
       longueur  des  chaines,  le programme appelant doit s'assurer de ne pas
       deborder l'espace d'adressage. C'est souvent difficile.  Notez  que  la
       longueur   des  chaines  peut  varier  avec  la  localisation  et  etre
       difficilement  previsible.  Il  faut  alors  utiliser   snprintf()   ou
       vsnprintf() a la place (ou encore asprintf(3) et vasprintf(3)).

       La  libc4.[45]  de  Linux  n'avait  pas  snprintf(), mais proposait une
       bibliotheque libbsd qui contenait un snprintf() equivalent a sprintf(),
       c'est-a-dire  qui  ignorait  l'argument  size.  Ainsi, l'utilisation de
       snprintf() avec les anciennes  libc4  pouvait  conduire  a  de  serieux
       problemes de securite.

       Un  code  tel  que  printf(foo); indique souvent un bogue, car foo peut
       contenir un caractere << % >>. Si foo vient d'une saisie non securisee,
       il peut contenir %n, ce qui autorise printf() a ecrire dans la memoire,
       et cree une faille de securite.

EXEMPLE

       Pour afficher pi avec cinq decimales :

           #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 >>, ou jour_semaine et mois sont des pointeurs sur des chaines :

           #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  different,  comme
       jour-mois-annee. Une version  internationale  doit  donc  etre  capable
       d'afficher les arguments dans l'ordre indique par le format :

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

       ou  le format depend 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 chaine de taille suffisante  et  ecrire  dedans  (code
       correct aussi bien pour glibc 2.0 que glibc 2.1) :

       #include <stdio.h>
       #include <stdlib.h>
       #include <stdarg.h>

       char *
       make_message(const char *fmt, ...)
       {
           int n;
           int size = 100; /* Supposons que nous n'avons pas besoin de plus de 100 octets. */
           char *p, *np;
           va_list ap;

           if ((p = malloc(size)) == NULL)
               return NULL;

           while (1) {

               /* Essayons d'ecrire dans l'espace alloue. */

               va_start(ap, fmt);
               n = vsnprintf(p, size, fmt, ap);
               va_end(ap);

               /* Si cela fonctionne, renvoie la chaine. */

               if (n > -1 && n < size)
                   return p;

               /* Sinon, essayons encore avec plus de place. */

               if (n > -1) /* glibc 2.1 */
                   size = n+1; /* exactemen ce qui est necessaire */
               else            /* glibc 2.0 */
                   size *= 2;  /* double la taille */

               if ((np = realloc (p, size)) == NULL) {
                   free(p);
                   return NULL;
               } else {
                   p = np;
               }
           }
       }

VOIR AUSSI

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

COLOPHON

       Cette page fait partie de  la  publication  3.32  du  projet  man-pages
       Linux.  Une description du projet et des instructions pour signaler des
       anomalies      peuvent      etre       trouvees       a       l'adresse
       <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

       Depuis  2010,  cette  traduction est maintenue a l'aide de l'outil po4a
       <URL:http://po4a.alioth.debian.org/>   par   l'equipe   de   traduction
       francophone        au        sein        du       projet       perkamon
       <URL:http://perkamon.alioth.debian.org/>.

       Christophe Blaess  <URL:http://www.blaess.fr/christophe/>  (1996-2003),
       Alain  Portal  <URL:http://manpagesfr.free.fr/>  (2003-2006).   Nicolas
       Francois et l'equipe francophone de traduction de Debian (2006-2009).

       Veuillez  signaler  toute  erreur   de   traduction   en   ecrivant   a
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous pouvez toujours avoir acces a la version anglaise de  ce  document
       en utilisant la commande << man -L C <section> <page_de_man> >>.