asprintf, aswprintf, vasprintf, vaswprintf
來自 cppreference.com
定義於標頭檔案 <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
替換,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