您的位置:首页 > 编程语言 > C语言/C++

格式化字符串——以C++的名义 - [软件开发]

2013-06-20 18:34 363 查看
此博客已经停止更新,并乔迁新址http://chenlq.net,感谢大家对本博客的喜爱,

希望在新的站点能够继续和大家一起交流学习。谢谢大家:)

这几天在做一个项目的移植工作,将其从原来的6.0移植到VS2008上,因为采用了新的unicode字符集,所以在处理字符串的时候遇到了很多问题,转载一篇文章,有帮助。

从第一堂C语言课上的那个printf开始,格式化字符串就成了我的梦魇。此后我还在很多地方遇到过它们:fprintf,sscanf以及 CString的Format成员函数……。除了能记住%s(String的缩写)代表字符串,%d(Decimal的缩写)代表整数之外,每次用到格式 化字符串的地方我都要求助于MSDN。

直到我看到C++的字符串格式化方式后,我决定从此抛弃C的那套格式化字符串的方法。

在C++里格式化字符串,用到的最多的类是:ostringstream以及它的宽字符版本wostringstream。

话不多说,如果要将一个整数n格式化成字符串以便输出之用

CString的方式是这样的:

CString str;

str.Format(_T("%d"), n);

ostringstream的方式:


ostringstream ost;


ost<<n;


string str = ost.str();

抛开效率不谈,起码不用再去记%d代表整数,%f代表浮点数,当然还有更复杂的格式控制输出的那些%(此处省略200字……)。

稍微复杂一点,如果要将整数以16进制的格式输出(这个恐怕是整数输出中最常用的功能了)


ostringstream ost;


ost<<hex<<showbase<<255;

如果以16进制大写的格式输出:


ostringstream ost;


ost<<hex<<showbase<<uppercase<<255;

可有时候希望以32位整数的方式来输出的时候,在前面通常要补上多个0,这时可以这样做:


ostringstream ost;


// 也许有更好的写法


ost<<"0X"<<hex<<uppercase<<setw(8)<<setfill(''0'')<<255;

比起格式化字符串来输入的字母更多,但我觉得这种以人话写出来的方式比较好记:)

对于浮点数,最长用的格式化功能莫过于在小数点后保留X位的做法。

比如在小数点后保留6位:


ostringstream ost;


// 将输出1234.567800


ost<<fixed<<setprecision(6)<<1234.5678;

保留3位


// 将输出1234.568,已经替我们做好了四舍五入


ost<<fixed<<setprecision(3)<<1234.5678;

实现机制

C++使用一种称为操控符的技术来控制格式化的输出。

经典的Hello World的C++版本大概是这样的:


std::cout<<"Hello World"<<endl;
这将在标准输出上输出Hello World后附带一个换行,并且刷新cout流。一个简单的endl包含了模板和运算符重载两个C++中极有分量的技术。

对endl的输出将引发下面这个重载了的<<运算符的调用(摘自VS2008的ostream文件):


_Myt& __CLR_OR_THIS_CALL operator<<(_Myt& (__cdecl *_Pfn)(_Myt&))


{ // call basic_ostream manipulator


_DEBUG_POINTER(_Pfn);


return ((*_Pfn)(*this));


} 而endl正好满足了这个重载的运算符的参数的格式:


_CRTIMP2_PURE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: