va_list是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个
用法:在函数里定义va_list 型的变量 ,这个变量是指向参数的指针 ,通过指针运算来调整访问的对象
相关操作:
va_list:传入参数,辅助获取参数;
va_start:对参数进行初始化;
va_arg:从参数列表一个一个取出;
av_end: 结束可变参数的获取,清空 va_list
【注意】:
- 函数本身无法知道参数类型以及参数的数量;
- 对于没有定义转移字的非POD,使用变长函数会导致未定义;
示例:
int SumOfFloat(int cnt, ...) {
va_list ap;
int sum = 0;
va_start(ap, cnt);
for (int i = 0; i < cnt; ++i) {
sum += va_arg(ap, int);
}
va_end(ap);
return sum;
}
int main() {
cout << SumOfFloat(3, 12, 10, 1) << endl;
return 0;
}
snprintf,用于格式化字符串,并将结果存储到一个字符数组中
/*
str:用于存储格式化后的字符串。
size:这是目标字符数组的最大容量。
format:格式化字符串。
...:这是可选的参数。
*/
int snprintf(char *str, size_t size, const char *format, ...);
#include
#include
int main() {
char buffer[50];
int a, b;
std::cin >> a >> b;
int c = a + b;
int result = snprintf(buffer, sizeof(buffer), "%d+%d=%d", a , b , c);
if (result >= 0 && result < sizeof(buffer)) {
printf("result format: %s\n", buffer);
} else {
printf("error.\n");
}
return 0;
}
snprintf不同的是它允许你使用变长参数列表(va_list)来传递参数。
/*
str:用于存储格式化后的字符串。
size:这是目标字符数组的最大容量。
format:这是一个格式化字符串
ap:va_list 类型的参数。
*/
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
vasprintf可以通过可变参数创建一个格式化的字符串,并将其存储在动态分配的内存中。
/*
str用于存储格式化字符串的结果。
format:格式化字符串的格式。
ap:va_list 类型的参数。
*/
int vasprintf(char **str, const char *format, va_list ap);
void format(const char* fmt , ...){
va_list al;
va_start(al , fmt);
format(fmt , al);
va_end(al);
}
void format(const char* fmt , va_list al){
char* buf = nullptr;
int len = vasprintf(&buf , fmt , al);
if(len != -1){
m_ss << std::string(buf , len);
free(buf);
}
}