博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ Format
阅读量:5966 次
发布时间:2019-06-19

本文共 1333 字,大约阅读时间需要 4 分钟。

hot3.png

场景:

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

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

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

 

 

[cpp] 

  1. std::wstring Format(const wchar_t *format,...)  
  2. {  
  3.     va_list argptr;  
  4.     va_start(argptr, format);  
  5.     int count = _vsnwprintf(NULL,0,format,argptr);  
  6.     va_end(argptr);  
  7.   
  8.     va_start(argptr, format);  
  9.     wchar_t* buf = (wchar_t*)malloc(count*sizeof(wchar_t));  
  10.     _vsnwprintf(buf,count,format,argptr);  
  11.     va_end(argptr);  
  12.       
  13.     std::wstring str(buf,count);  
  14.     free(buf);  
  15.     return str;  
  16. }  

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

 

 

[cpp] 

  1. typedef char *  va_list;  

 

[cpp] 

  1. #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )  
  2.   
  3. #define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )  
  4. #define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )  
  5. #define _crt_va_end(ap)      ( ap = (va_list)0 )  

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

 

snprintf 源码实现是通过计算%的个数来判断参数个数的.

 

参考:

 

[plain] 

  1. 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.   
  2. To make a successful call with the same argument and locale parameters, allocate a buffer holding at least len + 1 characters.  

转载于:https://my.oschina.net/u/4000302/blog/3048497

你可能感兴趣的文章
评论:我们该如何应对科技发展带来的失业
查看>>
《高可用架构·中国初创故事(第3期)》一1.4 认同企业文化
查看>>
《CATIA V5 从入门到精通(第二版)》—— 导读
查看>>
代码女神——程序界里一股清风
查看>>
《微课实战:Camtasia Studio入门精要》——第2章 录制视频 2.1 录制视频基本常识...
查看>>
《R与Hadoop大数据分析实战》一1.6 HDFS和MapReduce架构
查看>>
第八天:规划进度管理和定义活动,3中活动类型
查看>>
《人机交互与戏剧表演:用戏剧理论构建良好用户体验》一导读
查看>>
《交互式程序设计 第2版》一2.2 代码的本质
查看>>
Solr Admin中带高亮查询,带score查询;edismax的mm查询
查看>>
《机器学习系统设计:Python语言实现》一2.2 IPython控制台
查看>>
Java IO: 并发IO
查看>>
C++程序设计:原理与实践(进阶篇)15.6 实例:一个简单的文本编辑器
查看>>
10个重要的Linux ps命令实战
查看>>
运维前线:一线运维专家的运维方法、技巧与实践3.1 数据中心搬迁准备
查看>>
101个MySQL调试和优化技巧
查看>>
精诚合作 共创未来——阿里云数据智能合作策略介绍
查看>>
《游戏大师Chris Crawford谈互动叙事》一1.1 故事叙述的历史
查看>>
《Puppet实战手册》——导读
查看>>
《C程序员从校园到职场》一1.2 C语言的主要特点
查看>>