Provided by: manpages-de-dev_2.5-1_all bug

BEZEICHNUNG

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

ÜBERSICHT

       #include <stdio.h>

       int printf(const char *format, …);
       int fprintf(FILE *stream, const char *format, …);
       int dprintf(int fd, 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 vdprintf(int fd, 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():
           _XOPEN_SOURCE >= 500 || _ISOC99_SOURCE ||
               || /* Glibc-Versionen <= 2.19: */ _BSD_SOURCE

       dprintf(), vdprintf():
           Seit Glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Vor Glibc 2.10:
               _GNU_SOURCE

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 Ausgabedatenstrom stream; sprintf(),  snprintf(),  vsprintf()
       und vsnprintf() schreiben in die Zeichenkette str.

       Die  Funktion  dprintf() ist zu der Funktion fprintf() identisch, außer dass sie in einen Dateideskriptor
       fd statt in einen stdio-Stream ausgibt.

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

       Die  Funktionen  vprintf(),  vfprintf(),  vdprintf(),  vsprintf(),  vsnprintf()  sind  äquivalent  zu den
       Funktionen printf(), fprintf(),dprintf(), 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).

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

   Format der Formatzeichenkette
       Die Formatzeichenkette ist eine Zeichenkette, die, so vorhanden, in ihrem initialen Shift-Zustand beginnt
       und endet. Die Formatzeichenkette setzt sich zusammen aus Null oder  mehr  Anweisungen:  normale  Zeichen
       (nicht  %)  werden  unverändert  in den Ausgabedatenstrom kopiert; Umwandlungsanweisungen fordern jeweils
       null oder mehr Argumente. Jede Umwandlungsanweisung wird durch das Zeichen % eingeleitet  und  endet  mit
       einem  Umwandlungsbezeichner.  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 Umwandlungsbezeichner passen. Standardmäßig werden
       die  Argumente  in der angegebenen Reihenfolge benutzt, wobei jeder '*' (siehe Feldbreite und Genauigkeit
       weiter unten) und jedes Umwandlungsbezeichner das nächste Argument abfragt (und es ist ein  Fehler,  wenn
       nicht  ausreichend  Argumente  angegeben sind). Es kann auch an jeder Stelle, die ein Argument erfordert,
       explizit angeben werden, welches Argument verwendet wird, indem »%m$« anstelle von '%' und »*m$« anstelle
       von '*' geschrieben wird, 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 in der Formatzeichenkette 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 (siehe setlocale(3)). 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.

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

       #      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 der Schalter 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 - setzt  ein  0  außer  Kraft,
              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 Schalter werden vom C99-Standard definiert. Die Single  UNIX  Specification  spezifiziert
       einen weiteren Schalter.

       '      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
              (siehe  setlocale(3)).  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,  aber  SUSv3  fügt  es
              hinzu.

       Glibc 2.2 fügt ein weiteres Schalterzeichen 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.

   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 der Schalter 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 Schalter '-' 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.

   Genauigkeit
       Eine optionale Genauigkeit in der Form eines Punkts ('.') gefolgt von einer optionalen Dezimalzahl. Statt
       einer Dezimalzahl kann auch mittels »*« oder »*m$« (für irgendeine Dezimalzahl m) angegeben werden,  dass
       die  Genauigkeit im nächsten (oder m-ten) Argument gegeben ist, welches den Typ int haben muss. Falls die
       Genauigkeit einfach als '.' angegeben ist, wird eine  dafür  der  Wert  Null  angenommen.  Eine  negative
       Genauigkeit wird angenommen, falls die Genauigkeitsangabe weggelassen wird. Dies gibt die minimale Anzahl
       der Ziffern an, die bei den Umwandlungen d, i, o, u, x und X erscheinen, bzw. die Anzahl der Ziffern nach
       dem  Dezimaltrennzeichen bei a, A, e, E, f und F, die maximale Anzahl von signifikanten Ziffern bei g und
       G oder die maximale Anzahl von auszugebenden Zeichen einer Zeichenkette bei s und S.

   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.

       q      Ein Synonym für ll. Dies ist eine aus BSD abgeleitete nicht standardisierte Erweiterung, vermeiden
              sie die Verwendung in neuem Code.

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

       j      Eine folgende Ganzzahlumwandlung entspricht einem Argument vom Typ intmax_t  oder  uintmax_t  oder
              eine folgende n-Umwandlung entspricht einem Zeiger auf ein intmax_t-Argument.

       z      Eine  folgende Ganzzahlumwandlung entspricht einem Argument vom Typ ssize_t oder ssize_t oder eine
              folgende n-Umwandlung entspricht einem Zeiger auf ein size_t-Argument.

       Z      Ein nicht standardisiertes Synonym für z, das von vor dem Auftauchen von z stammt.  Verwenden  Sie
              es nicht in neuem Code.

       t      Eine  folgende  Ganzzahlumwandlung  entspricht einem Argument vom Typ ptrdiff_t oder eine folgende
              n-Umwandlung entspricht einem Zeiger auf ein ptrdiff_t-Argument.

       SUSv3 spezifiziert alle oben genannten, außer den Modifikatoren, die explizit als  nicht  standardisierte
       Erweiterungen  vermerkt sind. 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).

       Als eine nicht standardisierte Erweiterung behandelt die GNU-Implementierung ll und L  als  Synonyme,  so
       dass  Sie  llg  (als  Synonym  für das standardmäßige Lg) und Ld (als Synonym für das standardmäßige lld)
       schreiben können. Dies ist nicht portabel.

   Umwandlungsbezeichner
       Ein Zeichen, das den  Typ  der  anzuwendenden  Umwandlung  angibt.  Die  Umwandlungsbezeichner  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 ausgegeben, 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 ausgegeben, 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. SUSv3 fügt eine Spezifikation für F hinzu.
              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  oder  gleich  der Genauigkeit ist.
              Abschließende Nullen in den Nachkommastellen werden entfernt;  ein  Dezimaltrennzeichen  erscheint
              nur, wenn ihm mindestens eine Ziffer folgt.

       a, A   (C99;  nicht  in  SUSv2,  aber in SUSv3 hinzugefügt) 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 das 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 ansonsten groß
              genug, um Werte vom Typ double zu unterscheiden. Die Ziffer vor dem  Dezimaltrennzeichen  ist  für
              nicht  normalisierte  Zahlen  nicht  spezifiziert  und  für  normalisierte Zahlen nicht Null, aber
              ansonsten nicht spezifiziert.

       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 Zeichen (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.  Beachten  Sie,
              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, SUSv3 und SUSv4.) Synonym für lc. Nicht verwenden.

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

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

       n      Die Anzahl der bis dahin geschriebenen Zeichen wird in  der  Ganzzahl  gespeichert,  die  auf  das
              korrespondierende Argument zeigt. Das Argument muss ein int * oder eine Variante sein, deren Größe
              dem  (optional)  angegebenen  Längenmodifikator  der  Ganzzahl  entspricht.  Es wird kein Argument
              umgewandelt. (Dieses Verhalten wird nicht von der Bionic-C-Bibliothek unterstützt.) Das  Verhalten
              ist  nicht  definiert,  wenn  die  Umwandlungsspezifikation  Schalter,  eine  Feldbreite oder eine
              Genauigkeitsangabe enthält.

       m      (Glibc-Erweiterung, von uClibc und Musl unterstützt) Gibt die  Ausgabe  von  strerror(errno)  aus;
              kein Argument erforderlich.

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

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, dass die
       Ausgabe gekürzt wurde. (Siehe auch im Folgenden unter ANMERKUNGEN.)

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

ATTRIBUTE

       Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.
       ┌─────────────────────────┬───────────────────────┬────────────────┐
       │ SchnittstelleAttributWert           │
       ├─────────────────────────┼───────────────────────┼────────────────┤
       │ printf(), fprintf(),    │ Multithread-Fähigkeit │ MT-Safe locale │
       │ sprintf(), snprintf(),  │                       │                │
       │ vprintf(), vfprintf(),  │                       │                │
       │ vsprintf(), vsnprintf() │                       │                │
       └─────────────────────────┴───────────────────────┴────────────────┘

KONFORM ZU

       fprintf(), printf(), sprintf(), vprintf(), vfprintf(), vsprintf(): POSIX.1-2001, POSIX.1-2008, C89, C99.

       snprintf(), vsnprintf(): POSIX.1-2001, POSIX.1-2008, C99.

       Die Funktionen dprintf() und vdprintf() waren ursprünglich GNU-Erweiterungen, die später in  POSIX.1-2008
       standardisiert wurden.

       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.
       POSIX.1-2001 und neuer richten ihre Spezifikation von snprintf() an C99 aus.

       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.
       Beachten Sie, 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)).

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

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

       char *
       make_message(const char *fmt, …)
       {
           int size = 0;
           char *p = NULL;
           va_list ap;

           /* Benötigte Größe ermitteln */

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

           if (size < 0)
               return NULL;

           size++;             /* Für '\0' */
           p = malloc(size);
           if (p == NULL)
               return NULL;

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

           if (size < 0) {
               free(p);
               return NULL;
           }

           return p;
       }

       Bei Kürzungen in Glibc-Versionen vor 2.0.6 wird dies als ein  Fehler  aufgefasst  und  nicht  wohlwollend
       behandelt.

SIEHE AUCH

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

KOLOPHON

       Diese  Seite  ist  Teil  der  Veröffentlichung  4.15  des Projekts Linux-man-pages. Eine Beschreibung des
       Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden
       sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die   deutsche    Übersetzung    dieser    Handbuchseite    wurde    von    Martin    Eberhard    Schauer
       <Martin.E.Schauer@gmx.de>,   Mario   Blättermann   <mario.blaettermann@gmail.com>  und  Helge  Kreutzmann
       <debian@helgefjell.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                                            15. September 2017                                      PRINTF(3)