Namespaces
Variants

asprintf, aswprintf, vasprintf, vaswprintf

From cppreference.net
Definido en el encabezado <stdio.h>
int asprintf ( char ** restrict strp, const char * restrict fmt, ... ) ;
(1) (TR de memoria dinámica)
int aswprintf ( wchar_t ** restrict strp, const wchar_t * restrict fmt, ... ) ;
(2) (TR de memoria dinámica)
int vasprintf ( char ** restrict strp, const char * restrict fmt,
va_list arg ) ;
(3) (TR de memoria dinámica)
int vaswprintf ( wchar_t ** restrict strp, const wchar_t * restrict fmt,
va_list arg ) ;
(4) (TR de memoria dinámica)
1) Análogo de sprintf , excepto que asigna un almacenamiento lo suficientemente grande para contener la salida incluyendo el carácter nulo terminador, como si se llamara a malloc , y devuelve un puntero a ese almacenamiento a través del primer argumento. Este puntero debe pasarse a free para liberar el almacenamiento asignado cuando ya no sea necesario.
2) Igual que (1) , excepto que funciona con caracteres anchos wchar_t (por analogía con swprintf ).
3) Igual que (1) , con la lista de argumentos variables reemplazada por arg , que debe ser inicializada por la macro va_start (y posiblemente posteriores llamadas a va_arg ).
4) Igual que (3) , excepto que funciona con caracteres anchos wchar_t .

Contenidos

Parámetros

strp - Un puntero a un char * o wchar_t * que contendrá la salida formateada
fmt - Una cadena de formato como con printf / wprintf y funciones relacionadas
arg - Cualquier argumento adicional se utiliza como con vsprintf y vswprintf

Valor de retorno

El número de caracteres escritos, al igual que sprintf (1) , swprintf (2) , vsprintf (3) , o vswprintf (4) , respectivamente. Si no fue posible la asignación de memoria, o ocurre algún otro error, estas funciones devolverán - 1 , y el contenido de strp es indefinido.

Notas

Estas funciones son extensiones GNU, no están en C o POSIX. También están disponibles bajo *BSD. La implementación de FreeBSD establece strp a NULL en caso de error.

Las funciones vasprintf y vaswprintf no invocan la macro va_end .

Ejemplo

Se puede probar con 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);
}

Salida:

Demo asprintf:
dyn_buf: "Testing... %d, %d, %d"; 21 chars were written
Demo vasprintf:
dyn_buf: "Testing... 1, 2, 3"; 18 chars were written