如何使用vsprintf, vsnprintf等函数
2016-12-31 23:01
393 查看
前言
在一些c++的框架中,有很多小的util函数,通常每个框架里都会有一个log函数,用法类似于printf(fmt, ...), 比如cocos2d-x的log函数用法大概像下面这样:
log("size is %d, %d", w, h);
它们的实现就是借助于vsnprintf族函数。本质在于格式化一个字符串。
下面通过一个例子来说明如何使用vsnprintf族函数来实现一个字符串格式化函数
示例
这个格式化函数的用法像下面这样:int count(10); cout << format("count is %d\n", count);
format函数实现
std::string format(const char *fmt, ...) { va_list args, args1; va_start(args, fmt); va_copy(args1, args); string res(1 + vsnprintf(nullptr, 0, fmt, args1), 0); va_end(args1); vsnprintf(&res[0], res.size(), fmt, args); va_end(args); return res; }
代码讲解
std::string format(const char *fmt, ...) { // 定义两个va_list 类型的变量,这种变量可以用来处理变长参数:... va_list args, args1; // 初始化args va_start(args, fmt); // args1 是 args 的一个拷贝 va_copy(args1, args); // 使用nullptr和0作为前两个参数来获取格式化这个变长参数列表所需要的字符串长度 // 使用 string(size_t n, char c) 构造函数,构造一个长度为n的字符串,内容为n个c的拷贝 string res(1 + vsnprintf(nullptr, 0, fmt, args1), 0); // args1 任务完成,将其关闭,清理。 va_end(args1); // 使用args来格式化要返回的字符串res, 指定长度size vsnprintf(&res[0], res.size(), fmt, args); // args 任务完成,关闭,清理 va_end(args); return res; }
与vsnprintf族函数类似的,还有snprintf族函数, 用法大同小异。v开头的接受的参数类型是
va_list, snprintf等则直接接收参数
...
参考链接
cppreference.com作者水平有限,对相关知识的理解和总结难免有错误,还望给予指正,非常感谢!
在这里也能看到这篇文章:github博客, CSDN博客, 欢迎访问
相关文章推荐
- STM32+Keil 如何使用printf函数?
- 如何在单片机上使用printf函数
- 嵌入式系统中如何使用printf函数进行串口输出
- 如何在MDK环境下使用printf以及使用vsprintf
- C语言如何在可变参数函数中使用printf?
- 如何在MDK环境下使用printf以及使用vsprintf
- STM32+Keil 如何使用printf函数?
- 如何在串口调试助手上,使用printf()函数显示十进制的数据及汉字说明(c语言版)
- 如何得到类成员函数的指针(操作符.×和->*的使用)
- vsprintf, vswprintf与printf与函数的可变参数编程
- printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - 输出格式转换
- 如何通过使用 SQL Server 中的 Detach 和 Attach 函数将 SQL Server 数据库移到新位置
- 如何使用SetWindowRgn函数创建异形窗口
- [转帖]C#如何使用正则表达式来校验字段串输入的系列函数
- JAVA中使用printf(System.out.printf)如何格式化输出数字
- 如何使用SetWindowRgn函数创建异形窗口
- 如何使HTML元素的事件,使用我们封装类的成员函数作为处理函数
- Javascript:如何使用 escape()函数
- VBA与T-SQL之间的函数比较;SQL Server的SQL语句如何在ACCESS中使用?(转自http://access911.net)
- 如何有效地使用函数select()