snprintf(3) Library Functions Manual snprintf(3) BEZEICHNUNG snprintf, vsnprintf - Formatierte Zeichenkettenausgabe BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int snprintf(size_t Grosse; char zk[restrict Grosse], size_t Grosse, const char *restrict Format, ); int vsnprintf(size_t Grosse; 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 BESCHREIBUNG Diese Funktionen sind printf(3) ahnlich, ausser dass sie in die Zeichenkette zk anstatt in einen Datenstrom schreiben. Die Funktionen snprintf() und vsnprintf() schreiben hochstens Grosse byte (einschliesslich des abschliessenden Nullbytes (>>\0<<)) nach zk. vsnprintf() ist zu snprintf() aquivalent, ausser dass es mit einer va_list statt einer variablen Zahl von Argumenten aufgerufen wird. Diese Funktion ruft das Makro va_end nicht auf. Da es das Makro va_arg aufruft, ist der Wert von ap nach dem Aufruf nicht definiert. Siehe stdarg(3). C99 und POSIX.1-2001 legen fest, dass das Ergebnis nicht definiert ist, wenn ein Aufruf von snprintf() oder vsnprintf() zu einem Kopieren zwischen uberlappenden Objekten fuhren wurde (z.B. wenn das Zielzeichenkettenfeld und eines der ubergebenen Eingabe-Argumente sich auf den gleichen Puffer beziehen). Siehe WARNUNGEN. Format der Formatzeichenkette Siehe printf(3). RUCKGABEWERT Nach erfolgreicher Ausfuhrung geben diese Funktionen die Anzahl der ausgegebenen Bytes 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.) Bei einem Fehler wird ein negativer Wert zuruckgegeben und errno wird gesetzt, um den Fehler anzuzeigen. FEHLER Siehe printf(3). ATTRIBUTE Siehe attributes(7) fur eine Erlauterung der in diesem Abschnitt verwandten Ausdrucke. +-------------------------+-------------------------+------------------+ |Schnittstelle | Attribut | Wert | +-------------------------+-------------------------+------------------+ |snprintf(), vsnprintf() | Multithread-Fahigkeit | MT-Sicher locale | +-------------------------+-------------------------+------------------+ STANDARDS C11, POSIX.1-2008. GESCHICHTE SUSv2, C99, POSIX.1-2001. Bezuglich des Ruckgabewertes widersprechen sich SUSv2 und C99: Wird snprintf() mit size=0 aufgerufen, dann fordert SUSv2 einen nicht festgelegten Wert kleiner als 1, wahrend C99 erlaubt, dass zk in diesem Fall NULL ist und beschreibt den Ruckgabewert (wie ublich) als die Anzahl der Zeichen, die geschrieben worden waren, falls die Ausgabezeichenkette gross genug gewesen ware. POSIX.1-2001 und neuere richten ihre Spezifikation von snprintf() an C99 aus. WARNUNGEN Einige Programme verlassen sich leichtsinnig auf Code wie den folgenden snprintf(puf, countof(puf), "%s weiterer Text", puf); um Text an puf anzuhangen. Allerdings vermerken die Standards explizit, dass die Ergebnisse nicht definiert sind, falls sich die Quell- und Zielpuffer beim Aufruf von snprintf() und vsnprintf() uberlappen. Abhangig von der verwandten Version von gcc(1) und den eingesetzten Compiler-Optionen werden Aufrufe wie der vorstehende nicht die erwarteten Ergebnisse liefern. 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 Siehe printf(3). BEISPIELE 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 bestimomen. */ 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), printf(3), puts(3), scanf(3), setlocale(3), strfromd(3), wcrtomb(3), wprintf(3), locale(5) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von 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.18 7. Dezember 2025 snprintf(3)