asprintf, aswprintf, vasprintf, vaswprintf
Von cppreference.com
< C | experimental | dynamisch
| Definiert in Header <stdio.h> |
||
| int asprintf( char **restrict strp, const char *restrict fmt, ... ); |
(1) | (Dynamischer Speicher-TR) |
| int aswprintf( wchar_t **restrict strp, const wchar_t *restrict fmt, ... ); |
(2) | (Dynamischer Speicher-TR) |
| int vasprintf( char **restrict strp, const char *restrict fmt, va_list arg ); |
(3) | (Dynamischer Speicher-TR) |
| int vaswprintf( wchar_t **restrict strp, const wchar_t *restrict fmt, va_list arg ); |
(4) | (Dynamischer Speicher-TR) |
1) Analog von sprintf, mit der Ausnahme, dass ein ausreichend großer Speicher für die Ausgabe einschließlich des abschließenden Nullzeichens zugewiesen wird, als ob er durch einen Aufruf von malloc erfolgt wäre, und ein Zeiger auf diesen Speicher über das erste Argument zurückgegeben wird. Dieser Zeiger sollte mit free an free übergeben werden, um den zugewiesenen Speicher freizugeben, wenn er nicht mehr benötigt wird.
2) Gleich wie (1), mit der Ausnahme, dass es mit Wide-Zeichen wchar_t arbeitet (analog zu swprintf).
3) Gleich wie (1), wobei die variable Argumentenliste durch
arg ersetzt wird, die durch das Makro va_start (und möglicherweise nachfolgende va_arg-Aufrufe) initialisiert werden muss.4) Gleich wie (3), mit der Ausnahme, dass es mit Wide-Zeichen wchar_t arbeitet.
Inhalt |
[bearbeiten] Parameter
| strp | - | Ein Zeiger auf einen char* oder wchar_t*, der die formatierte Ausgabe enthalten wird |
| fmt | - | Eine Formatzeichenkette wie bei printf/wprintf und verwandten Funktionen |
| arg | - | Alle zusätzlichen Argumente werden wie bei vsprintf und vswprintf verwendet |
[bearbeiten] Rückgabewert
Die Anzahl der geschriebenen Zeichen, genau wie bei sprintf (1), swprintf (2), vsprintf (3) oder vswprintf (4). Wenn die Speicherzuweisung nicht möglich war oder ein anderer Fehler auftrat, geben diese Funktionen -1 zurück, und der Inhalt von strp ist undefiniert.
[bearbeiten] Anmerkungen
Diese Funktionen sind GNU-Erweiterungen und nicht in C oder POSIX enthalten. Sie sind auch unter *BSD verfügbar. Die FreeBSD-Implementierung setzt strp im Fehlerfall auf NULL.
Die Funktionen vasprintf und vaswprintf rufen das Makro va_end nicht auf.
[bearbeiten] Beispiel
Kann mit clang (C11) getestet werden
Führen Sie diesen Code aus
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> void test(const char *fmt, ...) { char* dyn_buf; printf("Demo asprintf:\n"); const int written_1 = asprintf(&dyn_buf, "%s", fmt); printf("dyn_buf: \"%s\"; %i chars were written\n", dyn_buf, written_1); free(dyn_buf); printf("Demo vasprintf:\n"); va_list args; va_start(args, fmt); const int written_2 = vasprintf(&dyn_buf, fmt, args); va_end(args); printf("dyn_buf: \"%s\"; %i chars were written\n", dyn_buf, written_2); free(dyn_buf); } int main(void) { test("Testing... %d, %d, %d", 1, 2, 3); }
Ausgabe
Demo asprintf: dyn_buf: "Testing... %d, %d, %d"; 21 chars were written Demo vasprintf: dyn_buf: "Testing... 1, 2, 3"; 18 chars were written