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に渡されるべきです。
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の実装では、エラー時にstrpをNULLに設定します。
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