Namespaces
Variants

asprintf, aswprintf, vasprintf, vaswprintf

From cppreference.net
Défini dans l'en-tête <stdio.h>
int asprintf ( char ** restrict strp, const char * restrict fmt, ... ) ;
(1) (TR mémoire dynamique)
int aswprintf ( wchar_t ** restrict strp, const wchar_t * restrict fmt, ... ) ;
(2) (TR mémoire dynamique)
int vasprintf ( char ** restrict strp, const char * restrict fmt,
va_list arg ) ;
(3) (TR mémoire dynamique)
int vaswprintf ( wchar_t ** restrict strp, const wchar_t * restrict fmt,
va_list arg ) ;
(4) (TR mémoire dynamique)
1) Analogue de sprintf , sauf qu'il alloue un espace de stockage suffisamment grand pour contenir la sortie incluant le caractère nul de terminaison, comme par un appel à malloc , et renvoie un pointeur vers cet espace via le premier argument. Ce pointeur doit être passé à free pour libérer l'espace alloué lorsqu'il n'est plus nécessaire.
2) Identique à (1) , sauf qu'il fonctionne avec les caractères larges wchar_t (par analogie avec swprintf ).
3) Identique à (1) , avec la liste d'arguments variables remplacée par arg , qui doit être initialisée par la macro va_start (et éventuellement par des appels ultérieurs à va_arg ).
4) Identique à (3) , sauf qu'il fonctionne avec des caractères larges wchar_t .

Table des matières

Paramètres

strp - Un pointeur vers un char * ou un wchar_t * qui contiendra la sortie formatée
fmt - Une chaîne de format comme avec printf / wprintf et les fonctions associées
arg - Tous les arguments supplémentaires sont utilisés comme avec vsprintf et vswprintf

Valeur de retour

Le nombre de caractères écrits, comme pour sprintf (1) , swprintf (2) , vsprintf (3) , ou vswprintf (4) , respectivement. Si l'allocation de mémoire n'était pas possible, ou si une autre erreur survient, ces fonctions retourneront - 1 , et le contenu de strp est indéfini.

Notes

Ces fonctions sont des extensions GNU, non présentes en C ou POSIX. Elles sont également disponibles sous *BSD. L'implémentation FreeBSD définit strp à NULL en cas d'erreur.

Les fonctions vasprintf et vaswprintf n'invoquent pas la macro va_end .

Exemple

Peut être testé avec 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);
}

Sortie :

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