网站企业制作,做网站需要源码,咖啡网页设计代码,简约wordpress主题va_list与格式化输出
va_list 文章目录 va_list与格式化输出va_list格式化输出snprintfvsnprintfvasprintf 实例 va_list是在C语言中解决变参问题的一组宏#xff0c;变参问题是指参数的个数不定#xff0c;可以是传入一个参数也可以是多个 用法#xff1a;在函数里定义va_…va_list与格式化输出
va_list 文章目录 va_list与格式化输出va_list格式化输出snprintfvsnprintfvasprintf 实例 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这是一个格式化字符串
apva_list 类型的参数。
*/
int vsnprintf(char *str, size_t size, const char *format, va_list ap);vasprintf
vasprintf可以通过可变参数创建一个格式化的字符串并将其存储在动态分配的内存中。
/*
str用于存储格式化字符串的结果。
format格式化字符串的格式。
apva_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);}
}