Namespaces
Variants

asprintf, aswprintf, vasprintf, vaswprintf

From cppreference.net
定義先ヘッダ <stdio.h>
int asprintf ( char ** restrict strp, const char * restrict fmt, ... ) ;
(1) (動的メモリ TR)
int aswprintf ( wchar_t ** restrict strp, const wchar_t * restrict fmt, ... ) ;
(2) (動的メモリ TR)
int vasprintf ( char ** restrict strp, const char * restrict fmt,
va_list arg ) ;
(3) (動的メモリ TR)
int vaswprintf ( wchar_t ** restrict strp, const wchar_t * restrict fmt,
va_list arg ) ;
(4) (動的メモリ TR)
1) sprintf の類似関数ですが、出力と終端ナル文字を含む十分な大きさのストレージを、あたかも malloc の呼び出しによって割り当て、そのストレージへのポインタを第一引数経由で返します。このポインタは不要になった際に割り当てられたストレージを解放するために free に渡す必要があります。
2) (1) と同様ですが、ワイド文字 wchar_t で動作します( swprintf との類推により)。
3) (1) と同様、可変引数リストが arg で置き換えられている。 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