命名空间
变体
操作

asprintf、aswprintf、vasprintf、vaswprintf

来自 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_t(类似于 swprintf)。
3)(1) 相同,只是将可变参数列表替换为 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) 相同。如果内存分配失败或发生其他错误,这些函数将返回 -1strp 的内容将是未定义的。

[编辑] 注释

这些函数是 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