1.snprintf()
函数原型为int snprintf(char *str, size_t size, const char *format, …)。
将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至str中。
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符(’ ’);
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符(’ ’),返回值为欲写入的字符串长度。
2.va_list 是在 C 语言中引入解决变参问题的一组宏,变参问题是指参数的个数不定或者每个参数的类型不同。
头文件:
#include
3.type va_arg (va_list ap, type)
该宏用于变参数函数调用过程中,type是当前参数类型,调用该宏后,ap指向变参数列表中的下一个参数,返回ap指向的参数值,是一个类型为type的表达式
void PrintInt(int cnt, ...) {
va_list ap;
int value;
va_start(ap, cnt);
for (int i = 0; i < cnt; i++) {
value = va_arg(ap, int);
printf("%dn", value);
}
va_end(ap);
}
int main(void) {
PrintInt(4, 1, 2, 3, 4);
}
输出结果:
1
2
3
4
这里说明一下输出打印结果的原因,涉及函数参数的传递原理。
va_list 的实现原理过程中函数参数是以栈的形式存取,从右至左入栈。
参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址。
使用 va_arg 函数取出的时候从栈顶开始取,所以上面的例子中取出的第一个参数是 1.
4.va_start();
C 库宏 void va_start(va_list ap, last_arg) 初始化 ap 变量,它与 va_arg 和 va_end 宏是一起使用的。
last_arg 是最后一个传递给函数的已知的固定参数,即省略号之前的参数。
ap – 这是一个 va_list 类型的对象,它用来存储通过 va_arg 获取额外参数时所必需的信息。
5.vsnprintf();
linux环境下是:vsnprintf
头文件:
#include
函数声明:
int _vsnprintf(char* str, size_t size, const char* format, va_list ap);
_vsnprintf是C语言库函数之一,属于可变参数。用于向字符串中打印数据、数据格式用户自定义。



