如何在c++中生成格式化的标准字符串

  介绍

这期内容当中小编将会给大家带来有关如何在c++中生成格式化的标准字符串,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>两种格式化字符串方法

众所周知,c++的<代码> std:: string>

在python3中,支持两种格式化字符串的方法,一种是C风格,格式化的部分用%开头,%后面的对应具体类型(比如% s对应字符串% d对应整型),另一种则是类型无关的风格,{0}对应第1个参数,{1}对应第2个参数。

在祝辞祝辞,“{0}& # 39;s  age  is  {1}“.format(“赤红,,,11)   “赤红& # 39;s  age  is  11“;   在祝辞祝辞,“% & # 39;s  age  is  % d", %,(“赤红,,,11)   “赤红& # 39;s  age  is  11“

而在c++中则只能借用C函数,用snprintf来格式化一片缓冲区

# define  BUFFSIZE  512年   ,char 缓冲区(BUFFSIZE);   ,snprintf (buf, BUFFSIZE,,“% & # 39; s  age  is  % d \ n",,“赤红,,,11);

亦或者用类型无关的流运算符

, std:: ostringstream 操作系统;   ,os  & lt; & lt;,“赤红“,& lt; & lt;,“& # 39; s  age  is “, & lt; & lt;, 11, & lt; & lt;,“\ n";   ,std:: string  s =, os.str ();

暂且不谈效率问题,这种用& lt; & lt;拼接多个不同类型对象的做法代码量较大,而且在控制具体输出格式时更为麻烦,比如控制数字所占位数,或者小数点后位数。至少繁杂得让我总是记不起来,宁可使用C风格snprintf来控制。比如

, double  d =, 3.1415926;   ,snprintf (buf, BUFFSIZE,,“圆周率:,% -8.3如果是祖冲之发现的\ n",, d); ,美元。/a.out    圆周率:3.142,是祖冲之发现的

通过% -8.3如果将低频(长即双浮动)类型的浮点数设置占位数为8,设置小数点后位数为3,负号表示左对齐,这种表示方法非常简单紧凑。

至于用c++的iomanip头文件实现,我还花了点时间查文档。

, double  d =, 3.1415926;   ,os  & lt; & lt;,“圆周率:,“,& lt; & lt;, std::环境运输及工务局局长(8),& lt; & lt; std::固定   ,,& lt; & lt; std::设置精度(3),& lt; & lt; std::离开   & lt; & lt;才能,d  & lt; & lt;,“是祖冲之发现的\ n";

除了代码如此之长以及有可能漏掉<代码> std::固定>

也许有人说,这种好处在于设置精度和环境运输及工务局局长接收的可以是一个变量而非常量。实际上snprintf一样可以做到。

, double  d =, 3.1415926;   ,int  n1 =, 8日,n2 =, 3;   ,snprintf (buf, BUFFSIZE,,“圆周率:,% - *。*如果是祖冲之发现的\ n",, n1,, n2,, d);

<强> c++包装snprintf生成格式化的std:: string对象

在APUE UNP TLPI这几本讲Linux下C编程的书中,都自己写了错误处理库来包装snprintf产生格式化的输出,以免每次重复定义缓冲区/调用snprintf等等。

这样的做法有个缺陷就是缓冲区(字符数组)长度有限制,当然一般而言缓冲区大小定义得足够大的话是足够的,毕竟打印太长的格式化字符串不如多调用几次函数。

另一方面,由于这些函数仅仅是打印信息,尤其是经常打印信息后直接退出程序,所以不会返回错误字符串。如果在c++中想要把错误信息作为异常传给上一层处理,这些函数是不够的。因此需要简单修改下。

inline  std:: string  format_string (const  char *,格式,va_list  args), {   ,constexpr  size_t  oldlen =, BUFSIZ;   ,char 缓冲[oldlen];,//,默认栈上的缓冲区   ,va_list  argscopy;   ,va_copy (argscopy, args);   ,size_t  newlen =, vsnprintf(及缓冲[0],oldlen,,格式,args), +, 1;   ,newlen + +,//,算上终止符& # 39;\ 0 & # 39;   ,if  (newlen 祝辞,oldlen),{,//默认缓冲区不够大,从堆上分配   std::才能vector, newbuffer (newlen);   vsnprintf才能(newbuffer.data (),, newlen,,格式,argscopy);   return 才能newbuffer.data ();   ,}   ,return 缓冲;   }      inline  std:: string  format_string (const  char *,格式,,…),{   ,va_list 参数;   ,va_start (args,格式);   ,auto  s =, format_string(格式,args);   ,va_end (args);      ,return 年代;   }

如何在c++中生成格式化的标准字符串