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 以释放分配的存储空间。
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