va_list与格式化输出
va_list
文章目录
- va_list与格式化输出
- va_list
- 格式化输出
- snprintf
- vsnprintf
- vasprintf
- 实例
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
snprintf,用于格式化字符串,并将结果存储到一个字符数组中
/*
str:用于存储格式化后的字符串。
size:这是目标字符数组的最大容量。
format:格式化字符串。
...:这是可选的参数。
*/
int snprintf(char *str, size_t size, const char *format, ...);
#include <iostream>
#include <stdlib.h>
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;
}
vsnprintf
snprintf不同的是它允许你使用变长参数列表(va_list)来传递参数。
/*
str:用于存储格式化后的字符串。
size:这是目标字符数组的最大容量。
format:这是一个格式化字符串
ap:va_list 类型的参数。
*/
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
vasprintf
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);}
}