码迷,mamicode.com
首页 > 其他好文 > 详细

stringstream vs sprintf, sscanf.

时间:2014-07-07 14:21:21      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   width   2014   代码   

开端

以前一直认为 stringstream 远不如 sprintf.

近日突然萌发了看看 stirngstream 是不是真的如我想的那么烂

正文

咱们来看看对比.

// stringstream.

stringstream sstream;
sstream << 1 << "abcc";
string str = sstream.str();  // 数字, 字符串混合.
sstream << "123";        
sstream >> num;         // 字符串转数字.

// sprintf.

string str(512, 0);
sprintf(&str[0], "%s%d", s, d);

sprintf(&str[0], "%[^a-z]%*[a-z]%[^a-z]%*[a-z]%[^\0]", "2014-asddsaqwfdsf6-qweljkhdkjfhs29");

// sscanf.

sscanf("123", "%d", &num);

 

从以上代码个来做比较.

stringstream:

提供了 数字, 字符串 互相转换功能.

完美支持string, 不需要提前知道 缓冲大小.

 

sprintf, sscanf.

需要提前设置缓冲大小, 比前者弱一点.

支持相当有限但非常强力的正则表达式, 完爆前者.

 

看到这, 聪明的你是不是已经猜到结果了呢.

逆袭

事实上, stringstream 相当强大, 只是你不知道...

咱们看看接下来的例子.

template<class T1, class T2>
inline T1 parseTo(const T2 t)
{
static stringstream sstream;
T1 r;
sstream << t;
sstream >> r;
sstream.clear();
return r;
}

int
i = parseTo<int>("123");
float f = parseTo<float>("1.23");
string str = parseTo<string>(123);

 

 有没有发现, 这种写法既方便又优美.

stringstream 真正强大的地方还在后面.. 

class date {
public:
   int year;
   int month;
    int day;
};

stringstream &operator<<(stringstream &sstream, const date &d)
{
    sstream << d.year << d.month << d.day;
}

stringstream &operator>>(stringstream &sstream, date &d)
{
    sstream >> d.year >> d.month >> d.day;
    return sstream;
}

stringstream是可扩展的.

 通过C++的重载运算符, 任何自定义类都可以通过stringstream转换.

 

再来看一段...

sstream << "2014";
sstream << "asddsaqwfdsf6qweljkhdkjfhs29";
string str = regex_replace(sstream.str(), "[a-zA-Z]+", "-");

 

又举了一个不恰当的例子.

此时 str == "2014-6-29";

自己封装下, stringstream可以支持完整的正则表达式...

完爆sprintf, sscanf....

stringstream vs sprintf, sscanf.,布布扣,bubuko.com

stringstream vs sprintf, sscanf.

标签:style   blog   color   width   2014   代码   

原文地址:http://www.cnblogs.com/mmc1206x/p/3815315.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!