printf, fprintf, dprintf, sprintf, snprintf, vprintf, vfprintf,
- Provided by: manpages-de-dev (Version: 1.11-1)
- Source: manpages-de
- Report a bug
#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():
dprintf(), vdprintf():
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.
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);
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);
Dem Zeichen % folgen null oder mehr der folgenden Schalter:
Die obigen fünf Schalter werden vom C99-Standard definiert. Die Single UNIX Specification spezifiziert einen weiteren Schalter.
Glibc 2.2 fügt ein weiteres Flag-Zeichen hinzu.
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.
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.
Im Folgenden steht »Ganzzahlumwandlung« für d, i, o, u, x oder X.
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).
Ein Zeichen, das den Typ der anzuwendenden Umwandlung angibt. Die Umwandlungsbezeichner und ihre Bedeutung sind:
(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.)
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.
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.
Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.
| Schnittstelle | Attribut | Wert |
| printf(), fprintf(), sprintf(), snprintf(), vprintf(), vfprintf(), vsprintf(), vsnprintf() | Multithread-Fähigkeit | MT-Safe locale |
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.
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.
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.
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.
printf(1), asprintf(3), dprintf(3), puts(3), scanf(3), setlocale(3), wcrtomb(3), wprintf(3), locale(5)
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/.
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>.