asprintf, aswprintf, vasprintf, vaswprintf
出自 cppreference.com
| 定義於標頭檔 <stdio.h> |
||
| int asprintf( char **restrict strp, const char **restrict fmt, ... ); |
(1) | (動態記憶體技術報告) |
| int aswprintf( wchar_t **restrict strp, const wchar_t **restrict fmt, ... ); |
(2) | (動態記憶體技術報告) |
| int vasprintf( char **restrict strp, const char **restrict fmt, va_list arg ); |
(3) | (動態記憶體技術報告) |
| int vaswprintf( wchar_t **restrict strp, const wchar_t **restrict fmt, va_list arg ); |
(4) | (動態記憶體技術報告) |
1) sprintf 的類似函式,不同之處在於它會分配足以容納輸出內容(包含結尾空字元)的記憶體空間(如同呼叫 malloc),並透過第一個參數回傳該空間的指標。當不再需要該記憶體時,應將此指標傳遞給 free 以釋放分配的空間。
3) 與 (1) 相同,但將可變參數列表替換為
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