Provided by: manpages-de-dev_1.4-1_all bug

BEZEICHNUNG

       printf,  fprintf,  sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - formatierte
       Ausgabe

ÜBERSICHT

       #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);

   Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

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

BESCHREIBUNG

       Die Funktionenfamilie printf()  erzeugt  Ausgaben  in  einem  im  Folgenden  beschriebenen
       Format.   Die   Funktionen   printf()   und   vprintf()  schreiben  ihre  Ausgabe  in  den
       Standardausgabekanal  stdout;  fprintf()  und  vfprintf()  schreiben  in  den  angegebenen
       Ausgabekanal  stream;  sprintf(),  snprintf(), vsprintf() und vsnprintf() schreiben in die
       Zeichenkette str.

       Die Funktionen snprintf() und vsnprintf() schreiben höchstens size  Bytes  (einschließlich
       des abschließenden Null-Bytes ('\0')) nach str.

       Die  Funktionen  vprintf(),  vfprintf(),  vsprintf(),  vsnprintf()  sind äquivalent zu den
       Funktionen printf(), fprintf(), sprintf() bzw. snprintf(), nur dass sie mit einer  va_list
       statt  einer  variablen  Zahl von Argumenten aufgerufen werden. Diese Funktionen rufen das
       Makro va_end nicht auf. Daher ist der Wert von ap nach dem Aufruf nicht  definiert.  Siehe
       stdarg(3).

       Diese acht Funktionen schreiben die Ausgabe unter Kontrolle einer Format-Zeichenkette, die
       angibt, wie die folgenden Argumente (oder Argumente, auf die mittels der  Möglichkeit  der
       variablen  Zahl von Argumenten von stdarg(3) zugegriffen wird) für die Ausgabe konvertiert
       werden.

       C99 und POSIX.1-2001 legen fest, dass die Ergebnisse nicht definiert sind, wenn ein Aufruf
       von  sprintf(),  snprintf(),  vsprintf()  oder  vsnprintf()  zu  einem  Kopieren  zwischen
       überlappenden  Objekten  führen  würde  (z.B.,  wenn  der  Ausgabepuffer  und  eines   der
       übergebenen Eingabe-Argumente sich auf den gleichen Puffer beziehen). Siehe ANMERKUNGEN.

   Rückgabewert
       Nach  erfolgreicher  Ausführung geben diese Funktionen die Anzahl der ausgegebenen Zeichen
       zurück (ohne das für den Abschluß der Zeichenkettenausgabe verwendete Null-Byte).

       Die  Funktionen  snprintf()  und  vsnprintf()  schreiben  nicht   mehr   als   size   Byte
       (einschließlich  dem  abschließenden  Null-Byte  '\0').  Falls  die  Ausgabe  wegen dieser
       Begrenzung gekürzt wurde, ist der Rückgabewert die Anzahl der Zeichen (ohne abschließendes
       Null-Byte),  die  bei ausreichendem Speicherplatz in die Ausgabe geschrieben worden wären.
       Damit bedeutet ein Rückgabewert von size oder mehr, das die Ausgabe gekürzt wurde.  (Siehe
       auch im Folgenden unter ANMERKUNGEN.)

       Wenn bei der Ausgabe ein Fehler auftritt, wird ein negativer Wert zurückgegeben.

   Format des Formatstrings
       Der   Formatstring   ist   eine  Zeichenkette,  die,  so  vorhanden,  in  ihrem  initialen
       Shift-Zustand beginnt und endet. Der Formatstring setzt sich zusammen aus Null  oder  mehr
       Anweisungen:  normale  Zeichen  (nicht  %) werden unverändert in den Ausgabekanal kopiert;
       Umwandlungsanweisungen fordern jeweils null oder mehr Argumente. Jede Umwandlungsanweisung
       wird  durch  das  Zeichen  % eingeleitet und endet mit einem Umwandlungssymbol. Dazwischen
       können (in dieser Reihenfolge) null oder mehr Flags (Schalter),  eine  optionale  minimale
       Feldbreite, eine optionale Genauigkeit und ein optionaler Längenmodifikator vorkommen.

       Die  Argumente  müssen  (nach  Typumwandlung)  genau  zu  den  Umwandlungssymbolen passen.
       Standardmäßig werden die Argumente in der angegebenen Reihenfolge benutzt, wobei jeder '*'
       und  jedes  Umwandlungssymbol  das  nächste  Argument abfragt (und es ist ein Fehler, wenn
       nicht ausreichend Argumente angegeben sind). Man  kann  auch  an  jeder  Stelle,  die  ein
       Argument  erfordert,  explizit  angeben,  welches Argument verwendet wird, indem man »%m$«
       anstelle von '%' und »*m$« anstelle von '*' schreibt, wobei die Dezimalzahl m die Position
       des gewünschten Arguments in der Argumentliste angibt, beginnend mit 1. Damit sind

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

       und

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

       gleichwertig.  Die zweite Form ermöglicht wiederholte Referenzen auf das gleiche Argument.
       Der C99-Standard schließt die aus der Single Unix Specification  stammende  Form  mit  '$'
       nicht  mit  ein.  Wenn  die '$' verwendende Form eingesetzt wird, muss sie durchgehend für
       alle Umwandlungen, die ein Argument erfordern, und alle Breiten- und Genauigkeitsargumente
       verwendet  werden,  darf  aber  mit  »%%«-Formaten (die kein Argument erfordern) vermischt
       werden. Es darf keine Lücken in der Zahl der mittels '$' spezifizierten  Argumente  geben;
       beispielsweise muss, wenn die Argumente 1 und 3 angegeben werden, auch Argument 2 irgendwo
       im Formatstring erwähnt werden.

       Für einige  numerische  Umwandlungen  wird  ein  Radixzeichen  (»Dezimalpunkt«)  oder  ein
       Tausender-Gruppierungszeichen  verwendet.  Das  tatsächlich benutzte Zeichen hängt von der
       LC_NUMERIC-Komponente der Locale ab. Die POSIX-Locale benutzt '.' als Radixzeichen und hat
       kein Gruppierungszeichen. Damit resultiert

               printf("%'.2f", 1234567.89);

       in  »1234567.89«  in  der  POSIX-Locale,  in  »1234567,89«  in  der  Locale  nl_NL  und in
       »1.234.567,89« in der Locale da_DK.

   Die Zeichen für die Flags (Schalter)
       Dem Zeichen % folgen null oder mehr der folgenden Flags:

       #      Der Wert soll in eine »alternative Form« gewandelt werden. Bei  o-Umwandlungen  ist
              das  erste  Zeichen  der Ausgabe eine Null (indem eine »0« vorangestellt wird, wenn
              der Wert nicht schon Null war). Bei den Umwandlungen x und X  wird  einem  Ergebnis
              ungleich  Null  die  Zeichenkette  »0x«  (oder  »0X«  bei X) vorangestellt. Bei den
              Umwandlungen  a,  A,  e,  E,  f,  F,  g  und  G  enthält  das  Ergebnis  immer  ein
              Dezimaltrennzeichen,  auch  wenn ihm keine Ziffern folgen. (Normalerweise tritt ein
              Dezimaltrennzeichen nur in Ergebnissen auf, wenn ihm eine Ziffer  folgt.)  Bei  den
              Umwandlungen  g  und  G werden nachfolgende Nullen nicht aus dem Ergebnis entfernt,
              wie sie es normalerweise würden. Für andere Umwandlungen  ist  das  Ergebnis  nicht
              definiert.

       0      Der  Wert soll mit Nullen aufgefüllt werden. Bei den Umwandlungen d, i, o, u, x, X,
              a, A, e, E, f, F, g und G wird der umgewandelte Wert links mit Nullen  anstatt  mit
              Leerzeichen  aufgefüllt. Werden sowohl 0 als auch - angegeben, so wird 0 ignoriert.
              Wenn eine Genauigkeit bei einer numerischen Umwandlung  (d,  i,  o,  u,  x  und  X)
              angegeben  ist, wird das Flag 0 ignoriert. Für andere Umwandlungen ist das Ergebnis
              nicht definiert.

       -      Der umgewandelte Wert soll  linksbündig  an  der  Feldgrenze  ausgerichtet  werden.
              (Standard  ist  rechtsbündige  Ausrichtung.)  Außer  bei  der Umwandlung n wird der
              umgewandelte Wert rechts mit Leerzeichen aufgefüllt  statt  links  mit  Leerzeichen
              oder Nullen. Ein - übersteuert ein 0, falls beide angegeben sind.

       ' '    (ein  Leerzeichen)  Vor  einer positiven Zahl (oder einer leeren Zeichenkette), die
              durch eine vorzeichenbehaftete Umwandlung mit erzeugt wurde, soll  ein  Leerzeichen
              erhalten bleiben.

       +      Vor  jeder  durch  eine  vorzeichenbehaftete  Umwandlung  erzeugten  Zahl  soll ein
              Vorzeichen (+ oder -) platziert werden. Standardmäßig wird ein Vorzeichen  nur  für
              negative Zahlen verwendet. Ein + übersteuert ein Leerzeichen, falls beide verwendet
              werden.

       Die obigen fünf Flags werden vom C-Standard definiert.  SUSv2  spezifiziert  ein  weiteres
       Flag.

       '      gibt  für  dezimale Umwandlungen (i, d, u, f, F, g, G) an, dass die Ausgabe mit dem
              Tausender-Gruppierungszeichen gruppiert werden soll,  wenn  die  Locale-Information
              eines  angibt.  Beachten  Sie,  dass  viele Versionen von gcc(1) diese Option nicht
              auswerten können und eine Warnung ausgeben werden. SUSv2  schließt  %'F  nicht  mit
              ein.

       Glibc 2.2 fügt ein weiteres Flag-Zeichen hinzu.

       I      Für  dezimale  Integer-Umwandlungen  (i, d, u) benutzt die Ausgabe die alternativen
              Ausgabeziffern der Locale, wenn es solche gibt. Beispielsweise bewirkt diese Option
              seit Glibc 2.2.3 arabisch-indische Ziffern in der persischen (»fa_IR«) Locale.

   Die Feldbreite
       Diese optionale Dezimalzahl gibt die minimale Feldbreite an; die erste Ziffer ist von Null
       verschieden. Wenn der umgewandelte Wert weniger Zeichen als die Feldbreite  hat,  wird  er
       links  mit  Leerzeichen aufgefüllt (oder rechts, wenn das Flag für Linksbündigkeit gesetzt
       ist). Statt einer Dezimalzahl kann auch »*« oder  »*m$«  (für  irgendeine  Integerzahl  m)
       angegeben  werden,  um  zu  spezifizieren,  dass  die  Feldbreite im nächsten (oder m-ten)
       Argument gegeben ist, welches vom Type int sein muss. Eine negative  Feldbreite  wird  als
       Flag  '-'  gefolgt  von  einer positiven Breite interpretiert. In keinem Fall bewirkt eine
       fehlende oder kleine Feldbreite das Abschneiden  eines  Feldes;  ist  das  Ergebnis  einer
       Umwandlung  breiter  als  die  Feldbreite,  so  wird  das  Feld erweitert, um das Ergebnis
       aufzunehmen.

   Die Genauigkeit
       An optional precision, in the form of a period ('.')   followed  by  an  optional  decimal
       digit  string.  Instead  of  a  decimal  digit string one may write "*" or "*m$" (for some
       decimal integer m) to specify that the precision is given in the next argument, or in  the
       m-th  argument, respectively, which must be of type int. If the precision is given as just
       '.', the precision is taken to be zero. A negative precision is taken as if the  precision
       were  omitted.  This gives the minimum number of digits to appear for d, i, o, u, x, and X
       conversions, the number of digits to appear after the radix character for a, A, e,  E,  f,
       and  F  conversions,  the maximum number of significant digits for g and G conversions, or
       the maximum number of characters to be printed from a string for s and S conversions.

   Der Längenmodifikator
       Im Folgenden steht »Ganzzahlumwandlung« für d, i, o, u, x oder X.

       hh     Eine folgende Ganzzahlumwandlung entspricht einem Argument vom Typ signed char oder
              unsigned  char  oder  eine  folgende  n-Umwandlung  entspricht einem Zeiger auf ein
              signed char-Argument.

       h      Eine folgende Ganzzahlumwandlung entspricht einem Argument vom Typ short  int  oder
              unsigned  short int oder eine folgende n-Umwandlung entspricht einem Zeiger auf ein
              short int-Argument.

       l      (ell) Eine folgende Ganzzahlumwandlung entspricht einem Argument vom Typ  long  int
              oder  unsigned long int oder eine folgende n-Umwandlung entspricht einem Zeiger auf
              ein  long  int-Argument  oder   eine   folgende   c-Umwandlung   entspricht   einem
              wint_t-Argument  oder  eine  folgende  s-Umwandlung entspricht einem Zeiger auf ein
              wchar_t-Argument.

       ll     (ell-ell) Eine folgende Ganzzahlumwandlung entspricht einem Argument vom  Typ  long
              long  int  oder  unsigned  long long int oder eine folgende n-Umwandlung entspricht
              einem Zeiger auf ein long long int-Argument.

       L      Eine folgende a-, A-, e-, E-, f-, F-, g- oder G-Umwandlung  entspricht  einem  long
              double-Argument. (C99 erlaubt %LF, aber SUSv2 nicht.)

       q      (»quad«. Nur 4.4BSD und Linux Libc5. Nicht benutzen.) Dies ist ein Synonym für ll.

       j      Eine  folgende  Ganzzahlumwandlung  entspricht einem Argument vom Typ intmax_t oder
              uintmax_t.

       z      Eine folgende Ganzzahlumwandlung entspricht einem  Argument  vom  Typ  size_t  oder
              ssize_t. (Linux Libc5 verwendet Z mit dieser Bedeutung. Nicht benutzen.)

       t      Eine folgende Ganzzahlumwandlung entspricht einem Argument vom Typ ptrdiff_t.

       SUSv2  kennt  nur  die Längenmodifikatoren h (in hd, hi, ho, hx, hX, hn) und l (in ld, li,
       lo, lx, lX, ln, lc, ls) und L (in Le, LE, Lf, Lg, LG).

   Das Umwandlungssymbol
       Ein Zeichen, das den Typ der anzuwendenden Umwandlung angibt. Die  Umwandlungssymbole  und
       ihre Bedeutung sind:

       d, i   Das  int-Argument  wird  umgewandelt  in  eine vorzeichenbehaftete Dezimalzahl. Die
              Genauigkeit, sofern vorhanden,  gibt  die  minimale  Anzahl  von  Ziffern  an,  die
              auftreten  muss; wenn der umgewandelte Wert weniger Ziffern benötigt, wird er links
              mit Nullen aufgefüllt. Die voreingestellte Genauigkeit ist  1.  Wird  0  mit  einer
              expliziten Genauigkeit 0 gedruckt, so ist die Ausgabe leer.

       o, u, x, X
              Das unsigned int-Argument wird in eine vorzeichenlose Oktal- (o), Dezimal- (u) oder
              Hexadezimalzahl  (x  und  X)  umgewandelt.  Die  Buchstaben   abcdef   werden   für
              x-Umwandlungen  benutzt; die Buchstaben ABCDEF für X-Umwandlungen. Die Genauigkeit,
              sofern vorhanden, gibt die minimale Anzahl vor Ziffern an, die auftreten muss; wenn
              der   umgewandelte  Wert  weniger  Ziffern  benötigt,  wird  er  links  mit  Nullen
              aufgefüllt. Die voreingestellte Genauigkeit ist 1.  Wird  0  mit  einer  expliziten
              Genauigkeit 0 gedruckt, so ist die Ausgabe leer.

       e, E   Das  double-Argument wird gerundet und in die Form [-]d.ddde+-dd umgewandelt, wobei
              eine Ziffer vor dem  Dezimaltrennzeichen  erscheint  und  die  Anzahl  der  Ziffern
              dahinter  der  Genauigkeit  entspricht; falls die Genauigkeit fehlt, wird sie als 6
              angenommen; falls die Genauigkeit Null  ist,  erscheint  kein  Dezimaltrennzeichen.
              Eine E-Umwandlung verwendet den Buchstaben E (in Gegensatz zu e), um den Exponenten
              einzuleiten. Der Exponent enthält immer mindestens zwei  Ziffern;  falls  der  Wert
              Null ist, ist der Exponent 00.

       f, F   Das  double-Argument  wird  gerundet und umgewandelt in dezimale Notation im Format
              [-]ddd.ddd, wobei  die  Anzahl  der  Ziffern  hinter  dem  Dezimaltrennzeichen  der
              vorgegebenen  Genauigkeit  entspricht.  Falls die Genauigkeit fehlt, wird sie als 6
              angenommen; falls die Genauigkeit Null  ist,  erscheint  kein  Dezimaltrennzeichen.
              Falls  ein  Dezimaltrennzeichen  erscheint,  befindet  sich  mindestens eine Ziffer
              davor.

              (SUSv2 kennt F nicht und besagt, dass Zeichenketten-Darstellungen für Unendlich und
              NaN  (Not  a Number - keine Zahl) verfügbar gemacht werden können. Der C99-Standard
              spezifiziert »[-]inf« oder »[-]infinity«  für  Unendlich  sowie  eine  Zeichenkette
              beginnend  mit  »nan«  für  NaN  im  Falle  von  f  und  entsprechen  »[-]INF« oder
              »[-]INFINITY« oder »NAN« im Falle von F.)

       g, G   Das double-Argument wird umgewandelt in das Format f oder e (oder F oder E für  die
              G-Umwandlung).  Die Genauigkeit gibt die Anzahl der signifikanten Stellen an. Falls
              die Genauigkeit fehlt, werden 6 Ziffern zurückgegeben; falls die  Genauigkeit  Null
              ist, wird sie als 1 angenommen. Form e wird benutzt, falls der Exponent kleiner als
              -4 oder größer als oder gleich der Genauigkeit ist.  Abschließende  Nullen  in  den
              Nachkommastellen  werden  entfernt;  ein Dezimaltrennzeichen erscheint nur, wenn es
              von mindestens einer Ziffer gefolgt wird.

       a, A   (C99; nicht  in  SUSv2)  Für  die  a-Umwandlung  wird  das  double-Argument  (unter
              Verwendung  der  Buchstaben abcdef) in hexadezimale Notation der Form [-]0xh.hhhhp±
              gebracht; für A werden dagegen  der  Präfix  0X,  die  Buchstaben  ABCDEF  und  das
              Exponententrennzeichen   P   verwendet.  Vor  dem  Dezimaltrennzeichen  steht  eine
              hexadezimale Ziffer, die Anzahl der Stellen dahinter  entspricht  der  Genauigkeit.
              Die  standardmäßige Genauigkeit genügt für eine exakte Darstellung des Wertes, wenn
              eine exakte Darstellung zur Basis 2 existiert und ist sonstigenfalls groß genug, um
              Werte  vom  Typ double zu unterscheiden. Die Ziffer vor dem Dezimaltrennzeichen ist
              unspezifiziert für nicht normalisierte Zahlen, und für normalisierte  Zahlen  nicht
              Null, aber ansonsten unspezifiziert.

       c      Wenn  kein  Modifikator l vorhanden ist, wird das int-Argument umgewandelt in einen
              unsigned char und das resultierende Zeichen ausgegeben. Wenn ein l  vorhanden  ist,
              wird  das wint_t-Argument (wide character) mit einem Aufruf der Funktion wcrtomb(3)
              zu einer Multibyte-Folge umgewandelt, mit der Konvertierung beginnend im  initialen
              Zustand, und die resultierende Multibyte-Zeichenkette wird ausgegeben.

       s      Wenn  kein Modifikator l vorhanden ist, wird das const char *-Argument erwartet als
              ein Zeiger auf ein Feld vom Typ Zeiger (Zeiger auf eine Zeichenkette). Zeichen  aus
              diesem Feld werden bis zu (aber nicht einschließlich) des terminierenden Null-Bytes
              ('\0') ausgegeben; wenn eine Genauigkeit angegeben ist, werden nicht  mehr  Zeichen
              als  die  angegebene Anzahl ausgegeben. Wenn eine Genauigkeit angegeben ist braucht
              kein Null-Byte vorhanden zu sein; wenn die Genauigkeit  nicht  angegeben  ist  oder
              größer als das Feld ist, muss das Feld ein abschließendes Null-Byte enthalten.

              Wenn  ein l vorhanden ist, wird das const wchar_t *-Argument als ein Zeiger auf ein
              Feld von  wide  characters  erwartet.  Wide  characters  aus  dem  Feld  werden  zu
              Multibyte-Zeichen  umgewandelt  (jedes  mit  einem  Aufruf der Funktion wcrtomb(3),
              beginnend im  initialen  Zustand  vor  dem  ersten  wide  character),  bis  zu  und
              einschließlich   des   terminierenden   wchar_t-Null-Zeichens.  Die  resultierenden
              Multibyte-Zeichen werden bis zum (aber  nicht  einschließlich)  des  abschließenden
              Null-Bytes  geschrieben.  Falls  eine  Genauigkeit angegeben ist, werden nicht mehr
              Bytes als die  angegebene  Anzahl  ausgegeben,  aber  es  werden  keine  partiellen
              Multibyte-Zeichen  ausgegeben.  Man  beachte,  dass  die Genauigkeit die Anzahl der
              geschriebenen  Bytes  angibt,  nicht  die   Anzahl   der   wide   characters   oder
              Bildschirmpositionen.   Das   Feld  muss  ein  terminierendes  wchar_t-Null-Zeichen
              enthalten, wenn nicht eine Genauigkeit gegeben ist, die so klein ist, dass die Zahl
              der geschriebenen Bytes sie übersteigt, bevor das Ende des Feldes erreicht ist.

       C      (Nicht in C99, aber in SUSv2.) Synonym für lc. Nicht verwenden.

       S      (Nicht in C99, aber in SUSv2.) Synonym für ls. Nicht verwenden.

       p      Das void *-Zeiger-Argument wird hexadezimal ausgegeben (wie bei %#x oder %#lx).

       n      Die  Anzahl  der  bisher  ausgegebenen Zeichen wird in dem Integer gespeichert, der
              durch das int *-Zeiger-Argument (bzw. ein Äquivalent) gegeben  ist.  Es  wird  kein
              Argument umgewandelt.

       m      (Glibc-Erweiterung)  Gibt  die  Ausgabe  von  strerror(errno)  aus;  kein  Argument
              erforderlich.

       %      Es wird ein '%' ausgegeben. Es wird kein  Argument  umgewandelt.  Die  vollständige
              Umwandlungsanweisung ist '%%'.

KONFORM ZU

       Die  Funktionen fprintf(), printf(), sprintf(), vprintf(), vfprintf(), und vsprintf() sind
       konform zu C89 und C99. Die Funktionen snprintf() und vsnprintf() sind konform zu C99.

       Hinsichtlich  des  Rückgabewerts  von  snprintf()  widersprechen  sich   SUSv2   und   der
       C99-Standard:  wird  snprintf()  mit  size=0  aufgerufen,  dann  fordert SUSv2 einen nicht
       spezifizierten Rückgabewert kleiner als 1, während C99 es zulässt, dass str in diesem Fall
       NULL  ist,  und  (wie  immer)  den Rückgabewert als die Anzahl der Zeichen angibt, die bei
       ausreichend großer Ausgabe-Zeichenkette geschrieben worden wären.

       Linux Libc4 kennt die fünf C-Standardschalter, die Längenmodifikatoren h,  l,  L  und  die
       Umwandlungen  c, d, e, E, f, F, g, G, i, n, o, p, s, u, x und X, wobei F ein Synonym für f
       ist. Zusätzlich akzeptiert sie D, O und U als  synonyme  für  ld,  lo  und  lu.  (Das  ist
       schlecht und verursachte später schwere Fehler, als die Unterstützung für %D auslief.) Sie
       kennt kein von der Locale abhängiges Radixzeichen, kein Tausender-Trennzeichen,  kein  NaN
       oder Unendlich und schließlich auch nicht »%m$« and »*m$«.

       Linux  Libc5  kennt  die fünf C-Standardschalter, den '-Schalter, Locale, »%m$« und »*m$«.
       Sie kennt die Längenmodifikatoren h, l, L, Z und q, akzeptiert aber L  und  q  sowohl  für
       long  double  als auch long long int (das ist ein Fehler). Sie erkennt F, D, O und U nicht
       mehr, fügt aber ein neues Umwandlungssymbol m hinzu, welches strerror(errno) ausgibt.

       Glibc 2.0 fügt die Umwandlungszeichen C und S hinzu.

       Glibc 2.1 fügt die Längenmodifikatoren hh, j, t und z sowie die Umwandlungszeichen a und A
       hinzu.

       Glibc 2.2 fügt das Umwandlungszeichen F mit C99-Semantik sowie den Schalter l hinzu.

ANMERKUNGEN

       Einige Programme verlassen sich leichtsinnig auf Code wie den folgenden

          sprintf(buf, "%s etwas mehr Text", buf);

       um  Text  an  buf  anzuhängen.  Jedoch  weisen die Standards explizit darauf hin, dass die
       Ergebnisse undefiniert sind, wenn  Quell-  und  Ziel-Puffer  beim  Aufruf  von  sprintf(),
       snprintf(),   vsprintf()   und   vsnprintf()  überlappen.  Abhängig  von  der  verwendeten
       gcc(1)-Version und den gewählten Compiler-Optionen erzeugen Aufrufe wie das obige Beispiel
       nicht die erwarteten Ergebnisse.

       Seit  der  Glibc-Version  2.1  ist  die  Implementierung  der  Funktionen  snprintf()  und
       vsnprintf() konform zu C99, verhält sich also wie oben beschrieben. Bis Glibc 2.0.6  gaben
       sie im Fall gekürzter Ausgaben -1 zurück.

FEHLER

       Da  sprintf()  und vsprintf() eine beliebig lange Zeichenkette annehmen, müssen Aufrufende
       darauf achten, nicht den tatsächlich verfügbaren Platz  zu  überschreiten;  dies  ist  oft
       unmöglich  sicherzustellen. Man beachte, dass die Länge der Zeichenketten oft abhängig von
       der Locale und schwierig vorherzusagen  sind.  Benutzen  Sie  stattdessen  snprintf()  und
       vsnprintf() (oder asprintf(3) und vasprintf(3)).

       Linux  Libc4.[45]  verfügt nicht über eine snprintf(), stellt aber eine libbsd bereit, die
       ein snprintf()-Äquivalent zu sprintf() enthält. Diese Version ignoriert das Argument size.
       Somit  führt  die  Verwendung  von  snprintf()  mit  frühen  Libc4-Versionen  zu  schweren
       Sicherheitsproblemen.

       Code wie beispielsweise printf(foo); weist häufig auf einen Fehler hin, da foo das Zeichen
       »%«  enthalten  kann. Stammt foo von ungeprüfter Nutzereingabe, kann es »%n« enthalten und
       veranlasst printf(), in den Speicher zu schreiben und erzeugt damit ein Sicherheitsloch.

BEISPIEL

       Um Pi mit fünf Dezimalstellen auszugeben:

           #include <math.h>
           #include <stdio.h>
           fprintf(stdout, "pi = %.5f\n", 4 * atan(1.0));

       Um Datum und Zeit in der Form `Sunday, July 3, 10:02' auszugeben, wobei weekday und  month
       Zeiger auf Zeichenketten sind:

           #include <stdio.h>
           fprintf(stdout, "%s, %s %d, %.2d:%.2d\n",
                   weekday, month, day, hour, min);

       Die   meisten   Länder   verwenden  die  Reihenfolge  Tag-Monat-Jahr.  Deshalb  muss  eine
       internationalisierte Version in der Lage sein, die  Argumente  in  der  durch  das  Format
       angegebenen Reihenfolge zu drucken:

           #include <stdio.h>
           fprintf(stdout, format,
                   weekday, month, day, hour, min);

       wobei  format  von der Locale abhängt und möglicherweise die Argumente permutiert. Mit dem
       Wert

           "%1$s, %3$d. %2$s, %4$d:%5$.2d\n"

       könnte dann »Sonntag, 3. Juli, 10:02« dabei herauskommen.

       Um eine genügend große Zeichenkette bereitzustellen und in sie zu schreiben (der Code  ist
       korrekt sowohl für Glibc 2.0 als auch Glibc 2.1):

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

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

       char *
       make_message(const char *fmt, ...)
       {
           int n;
           int size = 100;     /* Annahme: Wir brauchen nicht mehr als
                                         100 Byte. */
           char *p, *np;
           va_list ap;

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

           while (1) {

               /* Versuch, in den bereitgestellten Speicherplatz zu schreiben. */

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

               /* Fehlercode prüfen */

               if (n < 0)
                   return NULL;

               /* Wenn das geklappt hat, die Zeichenkette zurückgeben. */

               if (n < size)
                   return p;

               /* anderenfalls mit mehr Platz nochmals versuchen */

               size = n + 1;       /* Genau was benötigt wird */

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

SIEHE AUCH

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

KOLOPHON

       This  page  is  part  of release 3.54 of the Linux man-pages project. A description of the
       project,    and    information    about    reporting    bugs,    can    be    found     at
       http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die   deutsche   Übersetzung  dieser  Handbuchseite  wurde  von  Martin  Eberhard  Schauer
       <Martin.E.Schauer@gmx.de> erstellt.

       Diese Übersetzung ist Freie Dokumentation;  lesen  Sie  die  GNU  General  Public  License
       Version   3  oder  neuer  bezüglich  der  Copyright-Bedingungen.  Es  wird  KEINE  HAFTUNG
       übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-
       Mail an <debian-l10n-german@lists.debian.org>.