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

GNU                                             4. September 2013                                      PRINTF(3)