Provided by: manpages-fr-dev_3.27fr1.4-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'au caractere 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, ...)
       {
           /* Supposons que nous n'avons pas besoin de plus de 100 octets. */
           int n, size = 100;
           char *p, *np;
           va_list ap;

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

           while (1) {
               /* Essayons avec l'espace alloue. */
               va_start(ap, fmt);
               n = vsnprintf(p, size, fmt, ap);
               va_end(ap);
               /* Si ca marche, renvoyer la chaine. */
               if (n > -1 && n < size)
                   return p;
               /* Sinon reessayer avec plus de place. */
               if (n > -1)    /* glibc 2.1 */
                   size = n+1;    /* ce qu'il fallait */
               else               /* glibc 2.0 */
                   size *= 2;     /* deux fois plus */
               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.27 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> >>.