作者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
1F:推 legnaleurc:嗯 ... 所以 istringstream 有什麽问题吗? 10/09 23:39
2F:推 stonehomelaa:istringstream好像是以space来分隔吧? 10/09 23:59
3F:→ stonehomelaa:不能自己定delimiter吧 10/10 00:00
4F:推 legnaleurc:getline 10/10 02:57
5F:推 Hitmear:一起床就看到这好文~非推不可阿~~ 10/10 09:08
6F:推 Ebergies:重点在麻烦 10/10 09:21
7F:→ Ebergies:普通情况用 istringstream 方便多了, 不用带档案到处跑 10/10 09:22