asprintf, aswprintf, vasprintf, vaswprintf
From cppreference.com
< c | experimental | dynamic
Defined in header <stdio.h>
|
||
int asprintf(
char
**
restrict strp, const
char
*
restrict fmt, ... )
;
|
(1) | (dynamic memory TR) |
int aswprintf(
wchar_t
**
restrict strp, const
wchar_t
*
restrict fmt, ... )
;
|
(2) | (dynamic memory TR) |
int vasprintf(
char
**
restrict strp, const
char
*
restrict fmt,
va_list arg ) ; |
(3) | (dynamic memory TR) |
int vaswprintf(
wchar_t
**
restrict strp, const
wchar_t
*
restrict fmt,
va_list arg ) ; |
(4) | (dynamic memory TR) |
1) Analog of sprintf, except that it allocates a storage large enough to hold the output including the terminating null character, as if by a call to malloc, and returns a pointer to that storage via the first argument. This pointer should be passed to free
3) Same as (1), with the variable argument list replaced by
arg
, which shall be initialized by the va_start macro (and possibly subsequent va_arg
4) Same as (3), except that it works with wide characters wchar_t.
Parameters
strp | - | A pointer to a char* or wchar_t* |
fmt | - | A format string as with printf/wprintf and related functions |
arg | - | Any extra arguments are used as with vsprintf and vswprintf |
Return value
The number of characters written, just like sprintf
(1), swprintf
(2), vsprintf
(3), or vswprintf
(4), respectively. If memory allocation wasn't possible, or some other error occurs, these functions will return -1, and the contents of strp
Notes
These functions are GNU extensions, not in C or POSIX. They are also available under *BSD. The FreeBSD implementation sets strp
to NULL
on error.
The vasprintf
and vaswprintf
functions do not invoke the va_end macro.
Example
Can be tested with clang (C11)
Run this code
#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); }
Output:
Demo asprintf: dyn_buf: "Testing... %d, %d, %d"; 21 chars were written Demo vasprintf: dyn_buf: "Testing... 1, 2, 3"; 18 chars were written