Namespaces
Variants

asprintf, aswprintf, vasprintf, vaswprintf

From cppreference.net
定义于头文件 <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 - 额外参数,用法与 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