asprintf, aswprintf, vasprintf, vaswprintf
|
定义于头文件
<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) |
arg
,该参数必须通过
va_start
宏(以及后续可能的
va_arg
调用)进行初始化。
目录 |
参数
| 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