asprintf, aswprintf, vasprintf, vaswprintf
|
Определено в заголовке
<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) |
arg
, который должен быть инициализирован с помощью макроса
va_start
(и, возможно, последующих вызовов
va_arg
).
Содержание |
Параметры
| strp | - | Указатель на char * или wchar_t * , который будет содержать форматированный вывод |
| fmt | - | Строка формата, как в printf / wprintf и связанных функциях |
| arg | - | Дополнительные аргументы используются как в vsprintf и vswprintf |
Возвращаемое значение
Количество записанных символов, так же как и
sprintf
(1)
,
swprintf
(2)
,
vsprintf
(3)
, или
vswprintf
(4)
, соответственно. Если выделение памяти было невозможно, или произошла другая ошибка, эти функции вернут
-
1
, и содержимое
strp
не определено.
Примечания
Эти функции являются расширениями GNU, а не стандартом C или POSIX. Они также доступны в *BSD. Реализация FreeBSD устанавливает
strp
в
NULL
при ошибке.
Функции
vasprintf
и
vaswprintf
не вызывают макрос
va_end
.
Пример
Может быть протестировано с помощью clang (C11)
#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); }
Вывод:
Demo asprintf: dyn_buf: "Testing... %d, %d, %d"; 21 chars were written Demo vasprintf: dyn_buf: "Testing... 1, 2, 3"; 18 chars were written