看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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