Provided by: manpages-de-dev_1.11-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():
           _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L;
           oder cc -std=c99

       dprintf(), vdprintf():
           Seit Glibc 2.10:
               _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
           Bis 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.

       The function dprintf()  is the same as fprintf(3)   except  that  it  outputs  to  a  file
       descriptor, fd, instead of to a stdio stream.

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

   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.

   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.

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

       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.

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

   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 soll ein int * oder eine
              Variante  sein,  deren  Größe  dem  (optional)  angegebenen  Längenmodifikator  der
              Ganzzahl  entspricht.  Es  wird  kein Argument umgewandelt. Das Verhalten ist nicht
              definiert, wenn die Umwandlungsspezifikation Schalter, eine  Feldbreite  oder  eine
              Genauigkeitsangabe enthält.

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

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.

       The dprintf()  and vdprintf()  functions were originally GNU extensions  that  were  later
       standardized in POSIX.1-2008.

       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;

           /* Determine required size */

           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);
           if (size < 0) {
               free(p);
               return NULL;
           }
           va_end(ap);

           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),   dprintf(3),   puts(3),   scanf(3),  setlocale(3),  wcrtomb(3),
       wprintf(3), locale(5)

KOLOPHON

       Diese Seite  ist  Teil  der  Veröffentlichung  4.04  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 http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die  deutsche  Übersetzung  dieser  Handbuchseite  wurde  von  Martin   Eberhard   Schauer
       <Martin.E.Schauer@gmx.de> und Mario Blättermann <mario.blaettermann@gmail.com> 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>.