作者NCUking (中大王)
看板C_and_CPP
標題Re: [心得] 最近在學C++的一點心得 關於字串處理
時間Fri Oct 9 23:29:59 2009
※ 引述《Hitmear (屍殌化液)》之銘言:
: 我之前是學JAVA的,轉到C++的時候老實說還滿不習慣的
: C++雖然是高階語言,但整個結構好像沒有到那麼高階
: 在寫JAVA的時候,感受很深刻,為了處理一種類型的工作就定義了一種container
: 會有許多函式可以使用
: 但是到了C++,全部都要自己來
: 好比字串處理的拆段子,在JAVA下有stringTokenizer可以用
: 可以丟進去各種符號讓它自動拆,只要next()就會跑出下一個段子,滿方便的
: C++好似沒有這種東西,雖然在新版的STL中加入了string的型別
: 但這種全自動的功能好像沒有
: 可是很明顯的是,用C++寫出來的程式就是跑比較快
: 一個是先甘後苦、一個是先苦後甘,各有風味
: 以上,是一點淺見,請高人指教
: 關於自動切字串,在STL裡面沒看過,還是有替代方案?
有 用string那些member function兜出來
可以參考C++ Cookbook這本書,裡面有實作一個類Java的StringTokenizer
程式碼範例可以在官方網站上下載
Example 4-12. A string tokenizer
#include <string>
#include <iostream>
using namespace std;
// String tokenizer class.
class StringTokenizer {
public:
StringTokenizer(const string& s, const char* delim = NULL) :
str_(s), count_(-1), begin_(0), end_(0) {
if (!delim)
delim_ = " \f\n\r\t\v"; //default to whitespace
else
delim_ = delim;
// Point to the first token
begin_ = str_.find_first_not_of(delim_);
end_ = str_.find_first_of(delim_, begin_);
}
size_t countTokens( ) {
if (count_ >= 0) // return if we've already counted
return(count_);
string::size_type n = 0;
string::size_type i = 0;
for (;;) {
// advance to the first token
if ((i = str_.find_first_not_of(delim_, i)) == string::npos)
break;
// advance to the next delimiter
i = str_.find_first_of(delim_, i+1);
n++;
if (i == string::npos)
break;
}
return (count_ = n);
}
bool hasMoreTokens( ) {return(begin_ != end_);}
void nextToken(string& s) {
if (begin_ != string::npos && end_ != string::npos) {
s = str_.substr(begin_, end_-begin_);
begin_ = str_.find_first_not_of(delim_, end_);
end_ = str_.find_first_of(delim_, begin_);
}
else if (begin_ != string::npos && end_ == string::npos)
{
s = str_.substr(begin_, str_.length( )-begin_);
begin_ = str_.find_first_not_of(delim_, end_);
}
}
private:
StringTokenizer( ) {};
string delim_;
string str_;
int count_;
int begin_;
int end_;
};
int main( ) {
string s = " razzle dazzle giddyup ";
string tmp;
StringTokenizer st(s);
cout << "there are " << st.countTokens( ) << " tokens.\n";
while (st.hasMoreTokens( )) {
st.nextToken(tmp);
cout << "token = " << tmp << '\n';
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.130.83.81
推 legnaleurc:嗯 ... 所以 istringstream 有什麼問題嗎? 10/09 23:39
推 stonehomelaa:istringstream好像是以space來分隔吧? 10/09 23:59
→ stonehomelaa:不能自己定delimiter吧 10/10 00:00
推 legnaleurc:getline 10/10 02:57
推 Hitmear:一起床就看到這好文~非推不可阿~~ 10/10 09:08
推 Ebergies:重點在麻煩 10/10 09:21
→ Ebergies:普通情況用 istringstream 方便多了, 不用帶檔案到處跑 10/10 09:22