Namespaces
Variants

asprintf, aswprintf, vasprintf, vaswprintf

From cppreference.net
Определено в заголовке <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) Аналог функции sprintf , за исключением того, что он выделяет память достаточного размера для хранения вывода, включая завершающий нулевой символ, как если бы с помощью вызова malloc , и возвращает указатель на эту память через первый аргумент. Этот указатель должен быть передан в free для освобождения выделенной памяти, когда она больше не нужна.
2) То же, что и (1) , за исключением того, что работает с широкими символами wchar_t (по аналогии с swprintf ).
3) То же, что и (1) , но с заменой списка переменных аргументов на arg , который должен быть инициализирован с помощью макроса va_start (и, возможно, последующих вызовов va_arg ).
4) То же, что и (3) , за исключением того, что работает с широкими символами wchar_t .

Содержание

Параметры

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