snprintf(3)

BEZEICHNUNG
snprintf, vsnprintf - Formatierte Zeichenkettenausgabe

BIBLIOTHEK
Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT
#include <stdio.h>

int snprintf(size_t Größe;
            char zk[restrict Größe], size_t Größe,
            const char *restrict Format, …);
int vsnprintf(size_t Größe;
            char zk[restrict Größe], size_t Größe,
            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) ähnlich, außer dass sie in die Zeichenkette zk anstatt in einen Datenstrom schreiben.

Die Funktionen snprintf() und vsnprintf() schreiben höchstens Größe byte (einschließlich des abschließenden Nullbytes (»\0«)) nach zk.

vsnprintf() ist zu snprintf() äquivalent, außer 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 überlappenden Objekten führen würde (z.B. wenn das Zielzeichenkettenfeld und eines der übergebenen Eingabe-Argumente sich auf den gleichen Puffer beziehen). Siehe WARNUNGEN.

  Format der Formatzeichenkette
Siehe printf(3).

RÜCKGABEWERT
Nach erfolgreicher Ausführung geben diese Funktionen die Anzahl der ausgegebenen Bytes zurück (ohne das für den Abschluß der Zeichenkettenausgabe verwendete Nullbyte).

Die Funktionen snprintf() und vsnprintf() schreiben nicht mehr als Größe byte (einschließlich des abschließenden Nullbytes »\0«)). Falls die Ausgabe wegen dieser Begrenzung gekürzt wurde, ist der Rückgabewert die Anzahl der Zeichen (ohne abschließendes Nullbyte), die bei ausreichendem Speicherplatz in die Ausgabe geschrieben worden wären. Damit bedeutet ein Rückgabewert von Größe oder mehr, dass die Ausgabe gekürzt wurde. (Siehe auch im Folgenden unter WARNUNGEN.)

Bei einem Fehler wird ein negativer Wert zurückgegeben und errno wird gesetzt, um den Fehler anzuzeigen.

FEHLER
Siehe printf(3).

ATTRIBUTE
Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.
Schnittstelle | Attribut | Wert
snprintf(), vsnprintf() | Multithread-Fähigkeit | MT-Sicher locale

STANDARDS
C11, POSIX.1-2008.

GESCHICHTE
SUSv2, C99, POSIX.1-2001.

    Concerning the return value, SUSv2 and C99 contradict each other: when snprintf() is called with size=0 then SUSv2 stipulates an unspecified return value less than 1, while C99 allows str to be NULL in this case, and gives the return value (as always) as the number of characters that would have been written in case the output string has been large enough. POSIX.1-2001 and later align their specification of snprintf() with C99.

WARNUNGEN
Einige Programme verlassen sich leichtsinnig auf Code wie den folgenden

    snprintf(buf, countof(buf), "%s some further text", buf);

to append text to buf. However, the standards explicitly note that the results are undefined if source and destination buffers overlap when calling snprintf() and vsnprintf(). Depending on the version of gcc(1) used, and the compiler options employed, calls such as the above will not produce the expected results.

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
Siehe printf(3).

BEISPIELE
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 n = 0;
        size_t size = 0;
        char *p = NULL;
        va_list ap;

        /* Determine required size.  */

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

        if (n < 0)
            return NULL;

        size = (size_t) n + 1;      /* One extra byte for '\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 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), printf(3), puts(3), scanf(3), setlocale(3), strfromd(3), wcrtomb(3), wprintf(3), locale(5)

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) 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 die Mailingliste der Übersetzer (debian-l10n-german@lists.debian.org).