名前空間
変種
操作

asprintf, aswprintf, vasprintf, vaswprintf

From cppreference.com
< C‎ | experimental‎ | dynamic
ヘッダー <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_tswprintfのアナログ)で機能します。
3) (1)と同じですが、可変引数リストがargに置き換えられています。これはva_startマクロ(およびそれに続くva_arg呼び出し)によって初期化される必要があります。
4) (3)と同じですが、ワイド文字wchar_tで機能します。

目次

[編集] Parameters

strp - フォーマットされた出力を含むchar*またはwchar_t*へのポインタ
fmt - printf/wprintfおよび関連関数と同様のフォーマット文字列
arg - 追加の引数は、vsprintfおよびvswprintfの場合と同様に使用されます。

[編集] Return value

書き込まれた文字数。これはsprintf (1)swprintf (2)vsprintf (3)、またはvswprintf (4)とそれぞれ同じです。メモリ割り当てが不可能であったり、その他のエラーが発生した場合、これらの関数は-1を返し、strpの内容は未定義となります。

[編集] Notes

これらの関数はGNU拡張であり、CまたはPOSIXには含まれていません。 *BSDでも利用可能です。FreeBSDの実装では、エラー時にstrpNULLに設定します。

vasprintfおよびvaswprintf関数は、va_endマクロを呼び出しません。

[編集] Example

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
English 日本語 中文(简体) 中文(繁體)