场景:

1.  C语言有自己的sprintf函数,可是这个函数有个缺点,就是不知道须要创建多大的buffer, 这时候能够使用snprintf函数来计算大小,仅仅要參数 buffer为NULL, count为0就可以.

2.  这里实现std::string自己的sprintf也是用了snprintf的特性,先计算大小,再创建空间,之后存入std::string.

3.  还使用了C的可变參数特性.

std::wstring Format(const wchar_t *format,...)
{va_list argptr;va_start(argptr, format);int count = _vsnwprintf(NULL,0,format,argptr);va_end(argptr);va_start(argptr, format);wchar_t* buf = (wchar_t*)malloc(count*sizeof(wchar_t));_vsnwprintf(buf,count,format,argptr);va_end(argptr);std::wstring str(buf,count);free(buf);return str;
}

让我们看看可变參数的声明:

typedef char *  va_list;
#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )#define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _crt_va_end(ap)      ( ap = (va_list)0 )

注意: ap会累加,每次调用va_arg都会指向下一个參数,问题就是va_arg并不知道什么时候结束,所以假设设计其它的可变參数的函数,要先传入一个參数个数作为方法參数.

snprintf 源代码实现是通过计算%的个数来推断參数个数的.

參考:

http://blog.csdn.net/echoisland/article/details/6086406

https://msdn.microsoft.com/en-us/library/1kt27hek.aspx

https://msdn.microsoft.com/en-us/library/2ts7cx93.aspx

If buffer is a null pointer and count is zero, len is returned as the count of characters required to format the output, not including the terminating null.
To make a successful call with the same argument and locale parameters, allocate a buffer holding at least len + 1 characters.

转载于:https://www.cnblogs.com/yutingliuyl/p/6758546.html

[C/C++标准库]_[0基础]_[怎样实现std::string自己的Format(sprintf)函数]相关推荐

  1. [Windows]_[0基础]_[Release程序的崩溃报告minidump解决方式]

    场景: 1. Release的程序崩溃时,崩溃报告能够让开发者查明代码哪里出了问题,用处大大的. 2. 仅仅实用VS的编译器才支持,所以MinGW就无缘了. 3. 使用了未处理异常过滤处理函数. 4. ...

  2. [C/C++标准库]_[0基础]_[优先队列priority_queue的使用]

    std::priority_queue 场景: 1. 对于一个任务队列,任务的优先级由任务的priority属性指明,这时候就须要优先级越高的先运行.而queue并没有排序功能,这时priority_ ...

  3. [wxWidgets]_[0基础]_[不常见但有用的类wxStandardPaths]

    场景: 1.wxStandardPaths   用来获取各种系统路径.能够用于存放app的配置数据.比方文档文件夹,appData等. 代码: #include "wx/wxprec.h&q ...

  4. [C/C++]_[0基础]_[static_cast,reinterpret_cast,dynimic_cast的使用场景和差别]

    场景: 1. C++的对象差别于C的原因是他们能够有继承关系, 方法有重载, 覆盖关系等, 他们的对象内存数据结构因此也比較复杂. 2. 非常多情况下我们须要一个父类来存储子类的指针对象进行通用方法的 ...

  5. [Windows]_[0基础]_[使用命令行工具dumpbin分析文件]

    dumpbin(vs拥有) 1. 出口lib函数符号文件(symbols) dumpbin /exports zlib1.lib Microsoft (R) COFF/PE Dumper Versio ...

  6. python解释器环境中用于表示上一次运算结果的特殊变量_知到智慧树_中国画基础_作业题库答案...

    知到智慧树_中国画基础_作业题库答案 更多相关问题 消费者在举行婚礼时穿正式礼服,而在酒吧穿休闲套装,这是因为()情境不同. (内毒素)的主要成分是 ()一般由革兰氏阴性菌产生,是细胞壁中的成份.只有 ...

  7. 华南理工计算机基础知识题,华南理工_计算机应用基础_随堂练习答案(2017年)

    华南理工_计算机应用基础_随堂练习答案(2017年) (18页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 . . . .华南理工-计算 ...

  8. python标准库导入对象语句_下面哪些是正确的Python标准库对象导入语句?-智慧树Java程序设计(山东联盟-鲁东大学)章节答...

    Java程序设计(山东联盟-鲁东大学):下面哪些是正确的Python标准库对象导入语句?[单选题] A:保证两个或多个进程同时启动和结束 B:保证两个或多个线程同时启动和结束 C:保证任何时候只有一个 ...

  9. 深度学习_TensorFlow2.0基础_张量创建,运算,维度变换,采样

    Tensorflow2.0 基础 一:TensorFlow特性 1.TensorFlow An end-to-end open source machine learning platform end ...

最新文章

  1. 深度学习对机器人有多大的影响
  2. IPhoneX网页布局简介
  3. 微软Power BI技术文章与资源目录
  4. 作者:洪学海(1967-),男,博士,中国科学院计算技术研究所研究员,信息技术战略研究中心常务副主任。...
  5. 个性潮流的设计PSD分层模板
  6. python 全局变量与局部变量
  7. 小组文化——洗洗睡了的故事
  8. 软件测试——软件开发过程
  9. Cannot uninstall ‘requests’. It is a distutils installed project and thus we cannot accurately deter
  10. Java发送邮件(QQ邮箱)
  11. java pdf转png格式_如何在Java中将PDF转换为PNG或JPG
  12. 带宽与响应速度的关系
  13. 各类邮箱POP3和SMTP服务器地址和端口
  14. 软件项目风险评估报告
  15. 用友t3系统打印机如何连接到服务器,用友T3打印设置方法
  16. AR涂涂乐⭐九、视频展示及涂涂乐源文件
  17. html文件恢复工具,文件误删恢复工具
  18. 基于标签的蛋白质定量技术-iTRAQ,TMT
  19. keil_5软件编程护眼界面设置(护眼绿)
  20. SSM---MyBatis

热门文章

  1. windows安装python2
  2. python2/3 模块gmpy2在linux下安装
  3. 当安装软件后提示依赖没有安装时
  4. jQeury 批量删除
  5. HDU 2012 素数判断方式
  6. 很气很气——在python中切换selenium中的窗口
  7. java中运算符的优先级
  8. Skeljs – 用于构建响应式网站的前端开发框架
  9. Service Unavailable解决方法
  10. 本周计划(4月12日-19日)