名稱空間
變體
操作

asprintf, aswprintf, vasprintf, vaswprintf

來自 cppreference.com
< c‎ | 實驗性‎ | 動態
定義於標頭檔案 <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 - 任何額外引數,與 vsprintfvswprintf 相同

[編輯] 返回值

寫入的字元數,分別與 sprintf (1)swprintf (2)vsprintf (3)vswprintf (4) 相同。如果記憶體分配失敗或發生其他錯誤,這些函式將返回 -1,且 strp 的內容未定義。

[編輯] 注意

這些函式是 GNU 擴充套件,不在 C 或 POSIX 標準中。它們也可在 *BSD 下使用。FreeBSD 的實現會在錯誤時將 strp 設定為 NULL

vasprintfvaswprintf 函式不呼叫 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