printf(3) Library Functions Manual printf(3) BEZEICHNUNG printf, fprintf, dprintf, sprintf, snprintf, vprintf, vfprintf, vdprintf, vsprintf, vsnprintf - formatierte Ausgabe BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int printf(const char *restrict format, ); int fprintf(FILE *restrict datenstrom, const char *restrict format, ); int dprintf(int dd, const char *restrict format, ); int sprintf(char *restrict zk, const char *restrict format, ); int snprintf(char zk[restrict .grosse], size_t grosse, const char *restrict format, ); int vprintf(const char *restrict format, va_list ap); int vfprintf(FILE *restrict datenstrom, const char *restrict format, va_list ap); int vdprintf(int dd, const char *restrict format, va_list ap); int vsprintf(char *restrict zk, const char *restrict format, va_list ap); int vsnprintf(char zk[restrict .grosse], size_t grosse, const char *restrict format, va_list ap); Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)): snprintf(), vsnprintf(): _XOPEN_SOURCE >= 500 || _ISOC99_SOURCE || /* Glibc <= 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 Standardausgabedatenstrom stdout; fprintf() und vfprintf() schreiben in den angegebenen Ausgabedatenstrom datenstrom; sprintf(), snprintf(), vsprintf() und vsnprintf() schreiben in die Zeichenkette zk. Die Funktion dprintf() ist zu der Funktion fprintf() identisch, ausser dass sie in einen Dateideskriptor dd statt in einen stdio(3)-Datenstrom ausgibt. Die Funktionen snprintf() und vsnprintf() schreiben hochstens grosse Bytes (einschliesslich des abschliessenden Nullbytes (>>\0<<)) nach zk. Die Funktionen vprintf(), vfprintf(), vdprintf(), vsprintf(), vsnprintf() sind aquivalent 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 Moglichkeit der variablen Zahl von Argumenten von stdarg(3) zugegriffen wird) fur 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 uberlappenden Objekten fuhren wurde (z.B. wenn der Ausgabepuffer und eines der ubergebenen Eingabe-Argumente sich auf den gleichen Puffer beziehen). Siehe WARNUNGEN. Format der Formatzeichenkette Die Formatzeichenkette ist eine Zeichenkette, die, so vorhanden, in ihrem initialen Schiebe-Zustand beginnt und endet. Die Formatzeichenkette setzt sich zusammen aus Null oder mehr Anweisungen: normale Zeichen (nicht %) werden unverandert in den Ausgabedatenstrom kopiert; Umwandlungsanweisungen fordern jeweils null oder mehr Argumente. Jede Umwandlungsanweisung wird durch das Zeichen % eingeleitet und endet mit einem Umwandlungskennzeichner. Dazwischen konnen (in dieser Reihenfolge) null oder mehr Flags (Schalter), eine optionale minimale Feldbreite, eine optionale Genauigkeit und ein optionaler Langenmodifikator vorkommen. Pauschal ist die Konvertierungssyntax wie folgt: %[$][Schalter][Breite][.Genauigkeit][Langenmodifikator]Konvertierung Die Argumente mussen (nach Typumwandlung) genau zu den Umwandlungskennzeichner passen. Standardmassig werden die Argumente in der angegebenen Reihenfolge benutzt, wobei jeder >>*<< (siehe Feldbreite und Genauigkeit weiter unten) und jedes Umwandlungsbezeichner das nachste 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 gewunschten 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 ermoglicht wiederholte Referenzen auf das gleiche Argument. Der C99-Standard schliesst die aus der Single Unix Specification stammende Form mit >>$<< nicht mit ein. Wenn die >>$<< verwendende Form eingesetzt wird, muss sie durchgehend fur 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 Lucken 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 erwahnt werden. Fur einige numerische Umwandlungen wird ein Radixzeichen (>>Dezimalpunkt<<) oder ein Tausender-Gruppierungszeichen verwendet. Das tatsachlich benutzte Zeichen hangt 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 fur 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 enthalt 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 wurden. Fur m wird die Ausgabe von strerrorname_np(errno) dargestellt, falls errno einen gultigen Fehlercode enthalt, andernfalls wird der in errno gespeicherte Wert als Dezimalzahl ausgegeben. Fur andere Umwandlungen ist das Ergebnis nicht definiert. 0 Der Wert soll mit Nullen aufgefullt 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 aufgefullt. Werden sowohl 0 als auch - angegeben, so wird 0 ignoriert. Wenn eine Genauigkeit bei einer Ganzzahlumwandlung (d, i, o, u, x und X) angegeben ist, wird der Schalter 0 ignoriert. Fur andere Umwandlungen ist das Ergebnis nicht definiert. - Der umgewandelte Wert soll linksbundig an der Feldgrenze ausgerichtet werden (Standard ist rechtsbundige Ausrichtung). Ausser bei der Umwandlung n wird der umgewandelte Wert rechts mit Leerzeichen aufgefullt statt links mit Leerzeichen oder Nullen. Ein - setzt ein 0 ausser 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. Standardmassig wird ein Vorzeichen nur fur negative Zahlen verwendet. Ein + ubersteuert ein Leerzeichen, falls beide verwendet werden. Die obigen funf Schalter werden vom C99-Standard definiert. Die Single UNIX Specification spezifiziert einen weiteren Schalter. ' gibt fur 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 konnen und eine Warnung ausgeben werden. SUSv2 schliesst %'F nicht mit ein, aber SUSv3 fugt es hinzu. Beachten Sie, dass die Standard-Locale eines C-Programms >>C<< ist, dessen Locale-Informationen keine Tausender-Gruppierungszeichen anzeigt. Daher werden ohne vorherigen Aufruf von setlocale(3) keine Tausender-Gruppierungszeichen dargestellt. Glibc 2.2 fugt ein weiteres Schalterzeichen hinzu. I Fur dezimale Ganzzahlumwandlungen (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 aufgefullt (oder rechts, wenn der Schalter fur Linksbundigkeit gesetzt ist). Statt einer Dezimalzahl kann auch >>*<< oder >>*m$<< (fur irgendeine Ganzzahl m) angegeben werden, um zu spezifizieren, dass die Feldbreite im nachsten (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$<< (fur irgendeine Dezimalzahl m) angegeben werden, dass die Genauigkeit im nachsten (oder m-ten) Argument gegeben ist, welches den Typ int haben muss. Falls die Genauigkeit einfach als >>.<< angegeben ist, wird eine dafur 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. Langenmodifikator Im Folgenden steht >>Ganzzahlumwandlung<< fur 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 oder unsigned short oder eine folgende n-Umwandlung entspricht einem Zeiger auf ein short-Argument. l (ell) Eine folgende Ganzzahlumwandlung entspricht einem Argument vom Typ long oder unsigned long oder eine folgende n-Umwandlung entspricht einem Zeiger auf ein long-Argument oder eine folgende c-Umwandlung entspricht einem wint_t-Argument oder eine folgende s-Umwandlung entspricht einem Zeiger auf ein wchar_t-Argument. Bei einer folgenden a-, A-, e-, E-, f-, F-, g- oder G-Umwandlung wird dieser Langenmodifikator ignoriert (C99, nicht in SUSv2). ll (ell-ell) Eine folgende Ganzzahlumwandlung entspricht einem Argument vom Typ long long oder unsigned long long oder eine folgende n-Umwandlung entspricht einem Zeiger auf ein long long-Argument. q Ein Synonym fur 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 fur 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, ausser den Modifikatoren, die explizit als nicht standardisierte Erweiterungen vermerkt sind. SUSv2 kennt nur die Langenmodifikatoren 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 fur das standardmassige Lg) und Ld (als Synonym fur das standardmassige lld) schreiben konnen. Dies ist nicht portabel. Umwandlungskennzeichner Ein Zeichen, das den Typ der anzuwendenden Umwandlung angibt. Die Umwandlungskennzeichner 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 benotigt, wird er links mit Nullen aufgefullt. 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 fur x-Umwandlungen benutzt; die Buchstaben ABCDEF fur X-Umwandlungen. Die Genauigkeit, sofern vorhanden, gibt die minimale Anzahl vor Ziffern an, die auftreten muss; wenn der umgewandelte Wert weniger Ziffern benotigt, wird er links mit Nullen aufgefullt. 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 (die sich von 0 unterscheidet, falls das Argument nicht 0 ist) 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 enthalt 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 fur Unendlich und NaN (Not a Number - keine Zahl) verfugbar gemacht werden konnen. SUSv3 fugt eine Spezifikation fur F hinzu. Der C99-Standard spezifiziert >>[-]inf<< oder >>[-]infinity<< fur Unendlich sowie eine Zeichenkette beginnend mit >>nan<< fur NaN im Falle von f und entsprechen >>[-]INF<< oder >>[-]INFINITY<< oder >>NAN<< im Falle von F.) g, G Das double-Argument wird in das Format f oder e (oder F oder E fur die G-Umwandlung) umgewandelt. Die Genauigkeit gibt die Anzahl der signifikanten Stellen an. Falls die Genauigkeit fehlt, werden 6 Ziffern zuruckgegeben; falls die Genauigkeit Null ist, wird sie als 1 angenommen. Form e wird benutzt, falls der Exponent kleiner als -4 oder grosser oder gleich der Genauigkeit ist. Abschliessende 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 hinzugefugt) Fur die a-Umwandlung wird das double-Argument (unter Verwendung der Buchstaben abcdef) in hexadezimale Notation der Form [-]0xh.hhhhp+-d gebracht; fur A werden dagegen das Prafix 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 standardmassige Genauigkeit genugt fur eine exakte Darstellung des Wertes, wenn eine exakte Darstellung zur Basis 2 existiert und ist ansonsten gross genug, um Werte vom Typ double zu unterscheiden. Die Ziffer vor dem Dezimaltrennzeichen ist fur nicht normalisierte Zahlen nicht spezifiziert und fur normalisierte Zahlen nicht Null, aber ansonsten nicht spezifiziert. Der Exponent enthalt stets mindestens eine Ziffer; falls der Wert 0 ist, ist der Exponent 0. 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 einschliesslich) des abschliessenden Nullbytes (>>\0<<) ausgegeben; wenn eine Genauigkeit angegeben ist, werden nicht mehr Zeichen als die angegebene Anzahl ausgegeben. Wenn eine Genauigkeit angegeben ist, braucht kein Nullbyte vorhanden zu sein; wenn die Genauigkeit nicht angegeben ist oder grosser als das Feld ist, muss das Feld ein abschliessendes Nullbyte 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 weiten Zeichen), bis zu und einschliesslich des abschliessenden weiten Nullbytes. Die resultierenden Multibyte-Zeichen werden bis zum (aber nicht einschliesslich) des abschliessenden Nullbytes 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 weiten Zeichen oder Bildschirmpositionen. Das Feld muss ein abschliessendes weites Nullzeichen enthalten, wenn nicht eine Genauigkeit gegeben ist, die so klein ist, dass die Zahl der geschriebenen Bytes sie ubersteigt, bevor das Ende des Feldes erreicht ist. C (Nicht in C99, aber in SUSv2, SUSv3 und SUSv4.) Synonym fur lc. Nicht verwenden. S (Nicht in C99, aber in SUSv2, SUSv3 und SUSv4.) Synonym fur 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 Grosse dem (optional) angegebenen Langenmodifikator der Ganzzahl entspricht. Es wird kein Argument umgewandelt. (Dieser Kennzeichner wird nicht von der Bionic-C-Bibliothek unterstutzt.) Das Verhalten ist nicht definiert, wenn die Umwandlungsspezifikation Schalter, eine Feldbreite oder eine Genauigkeitsangabe enthalt. m (Glibc-Erweiterung, von uClibc und Musl unterstutzt) Gibt die Ausgabe von strerror(errno) (oder strerrorname_np(errno) in der alternativen Form) aus; es ist kein Argument erforderlich. % Es wird ein >>%<< ausgegeben. Es wird kein Argument umgewandelt. Die vollstandige Umwandlungsanweisung ist >>%%<<. RUCKGABEWERT Nach erfolgreicher Ausfuhrung geben diese Funktionen die Anzahl der ausgegebenen Zeichen zuruck (ohne das fur den Abschluss der Zeichenkettenausgabe verwendete Nullbyte). Die Funktionen snprintf() und vsnprintf() schreiben nicht mehr als grosse Byte (einschliesslich des abschliessenden Nullbytes >>\0<<)). Falls die Ausgabe wegen dieser Begrenzung gekurzt wurde, ist der Ruckgabewert die Anzahl der Zeichen (ohne abschliessendes Nullbyte), die bei ausreichendem Speicherplatz in die Ausgabe geschrieben worden waren. Damit bedeutet ein Ruckgabewert von grosse oder mehr, dass die Ausgabe gekurzt wurde. (Siehe auch im Folgenden unter WARNUNGEN.) Wenn bei der Ausgabe ein Fehler auftritt, wird ein negativer Wert zuruckgegeben. ATTRIBUTE Siehe attributes(7) fur eine Erlauterung der in diesem Abschnitt verwandten Ausdrucke. +-------------------------+-------------------------+------------------+ |Schnittstelle | Attribut | Wert | +-------------------------+-------------------------+------------------+ |printf(), fprintf(), | Multithread-Fahigkeit | MT-Sicher locale | |sprintf(), snprintf(), | | | |vprintf(), vfprintf(), | | | |vsprintf(), vsnprintf() | | | +-------------------------+-------------------------+------------------+ STANDARDS fprintf() printf() sprintf() vprintf() vfprintf() vsprintf() snprintf() vsnprintf() C11, POSIX.1-2008. dprintf() vdprintf() GNU, POSIX.1-2008. GESCHICHTE fprintf() printf() sprintf() vprintf() vfprintf() vsprintf() C89, POSIX.1-2001. snprintf() vsnprintf() SUSv2, C99, POSIX.1-2001. Hinsichtlich des Ruckgabewerts von snprintf() widersprechen sich SUSv2 und der C99-Standard: wird snprintf() mit grosse=0 aufgerufen, dann fordert SUSv2 einen nicht spezifizierten Ruckgabewert kleiner als 1, wahrend C99 es zulasst, dass zk in diesem Fall NULL ist, und (wie immer) den Ruckgabewert als die Anzahl der Zeichen angibt, die bei ausreichend grosser Ausgabe-Zeichenkette geschrieben worden waren. POSIX.1-2001 und neuer richten ihre Spezifikation von snprintf() an C99 aus. dprintf() vdprintf() GNU, POSIX.1-2008. Glibc 2.1 fugt die Langenmodifikatoren hh, j, t und z sowie die Umwandlungszeichen a und A hinzu. Glibc 2.2 fugt das Umwandlungszeichen F mit C99-Semantik sowie den Schalter l hinzu. Glibc 2.35 gibt der alternativen Form (#) des Umwandlungskennzeichners m eine Bedeutung, namlich %#m. WARNUNGEN Einige Programme verlassen sich leichtsinnig auf Code wie den folgenden sprintf(buf, "%s etwas mehr Text", buf); um Text an buf anzuhangen. 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() uberlappen. Abhangig von der verwendeten gcc(1)-Version und den gewahlten 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, verhalt sich also wie oben beschrieben. Bis Glibc 2.0.6 gaben sie im Fall gekurzter Ausgaben -1 zuruck. FEHLER Da sprintf() und vsprintf() eine beliebig lange Zeichenkette annehmen, mussen Aufrufende darauf achten, nicht den tatsachlich verfugbaren Platz zu uberschreiten; dies ist oft unmoglich sicherzustellen. Beachten Sie, dass die Lange der Zeichenketten oft abhangig 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 haufig auf einen Fehler hin, da foo das Zeichen >>%<< enthalten kann. Stammt foo von ungeprufter Nutzereingabe, kann es >>%n<< enthalten und veranlasst printf(), in den Speicher zu schreiben und erzeugt damit ein Sicherheitsloch. BEISPIELE Um Pi mit funf Dezimalstellen auszugeben: #include #include 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 fprintf(stdout, "%s, %s %d, %.2d:%.2d\n", weekday, month, day, hour, min); Die meisten Lander 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 fprintf(stdout, format, weekday, month, day, hour, min); wobei format von der Locale abhangt und moglicherweise die Argumente vertauscht. Mit dem Wert "%1$s, %3$d. %2$s, %4$d:%5$.2d\n" konnte dann >>Sonntag, 3. Juli, 10:02<< dabei herauskommen. Um eine genugend grosse Zeichenkette bereitzustellen und in sie zu schreiben (der Code ist korrekt sowohl fur Glibc 2.0 als auch Glibc 2.1): #include #include #include char * make_message(const char *fmt, ) { int n = 0; size_t size = 0; char *p = NULL; va_list ap; /* Benotigte Grosse ermitteln. */ va_start(ap, fmt); n = vsnprintf(p, size, fmt, ap); va_end(ap); if (n < 0) return NULL; size = (size_t) n + 1; /* Ein zusatzliches Byte fur >>\0<< */ p = malloc(size); if (p == NULL) return NULL; va_start(ap, fmt); n = vsnprintf(p, size, fmt, ap); va_end(ap); if (n < 0) { free(p); return NULL; } return p; } Bei Kurzungen 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) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer , Mario Blattermann und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 printf(3)