程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> stringstream vs sprintf, sscanf.

stringstream vs sprintf, sscanf.

編輯:C++入門知識

開端

以前一直認為 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....

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved