博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

上帝他爷

分别担任CU、ITPUB以及CSDN社区的MySQL版主! 我本来想说我是吃屎的! ^_^
  yueliangdao0608.cublog.cn

关于作者
姓名:杨涛
职业:DBA
年龄:25
位置:中国-武汉市
个性介绍:又长了一岁
QQ:38257291
MSN:yueliangdao0608@gmail.com
|| << >> ||
我的分类


找到一个StringTokenizer的C++源代码
/*StringTokenizer.h*/
#ifndef INCLUDE_STRINGTOKENIZER_H
#define INCLUDE_STRINGTOKENIZER_H
#include <string>
using namespace std;

class StringTokenizer {
public:
    StringTokenizer(const std::string& _str, const std::string& _delim);
    ~StringTokenizer(){};
    int countTokens();
    bool hasMoreTokens();
    string nextToken();
    int nextIntToken();
    double nextFloatToken();
    string nextToken(const std::string& delim);
    string remainingString();
    string filterNextToken(const std::string& filterStr);
private:
    string token_str;
    string delim;
};
=====================
/*
********************************************************
* *
* * StringTokenizer.cpp
********************************************************
*/


#include "StringTokenizer.h"

StringTokenizer::StringTokenizer(const string& _str, const string& _delim) {

if ((_str.length() == 0) || (_delim.length() == 0)) return;

token_str = _str;
delim = _delim;

/*
Remove sequential delimiter
*/
unsigned int curr_pos = 0;

while(true) {
if ((curr_pos = token_str.find(delim,curr_pos)) != string::npos) {
curr_pos += delim.length();

while(token_str.find(delim,curr_pos) == curr_pos) {
token_str.erase(curr_pos,delim.length());
  }
}
else
break;
}

/*
Trim leading delimiter
*/
if (token_str.find(delim,0) == 0) {
token_str.erase(0,delim.length());
}

/*
Trim ending delimiter
*/
curr_pos = 0;
if ((curr_pos = token_str.rfind(delim)) != string::npos) {
if (curr_pos != (token_str.length() - delim.length())) return;
token_str.erase(token_str.length() - delim.length(),delim.length());
  }
}


int StringTokenizer::countTokens() {

unsigned int prev_pos = 0;
int num_tokens = 0;

if (token_str.length() > 0) {
num_tokens = 0;

unsigned int curr_pos = 0;
while(true) {
if ((curr_pos = token_str.find(delim,curr_pos)) != string::npos) {
num_tokens++;
prev_pos = curr_pos;
curr_pos += delim.length();
}
else
break;
}
return ++num_tokens;
}
else {
return 0;
  }
}


bool StringTokenizer::hasMoreTokens() {
return (token_str.length() > 0);
}


string StringTokenizer::nextToken() {

if (token_str.length() == 0)
return "";

string tmp_str = "";
unsigned int pos = token_str.find(delim,0);

if (pos != string::npos) {
tmp_str = token_str.substr(0,pos);
token_str = token_str.substr(pos+delim.length(),token_str.length()-pos);
}
else {
tmp_str = token_str.substr(0,token_str.length());
token_str = "";
}

return tmp_str;
}


int StringTokenizer::nextIntToken() {
return atoi(nextToken().c_str());
}

double StringTokenizer::nextFloatToken() {
return atof(nextToken().c_str());
}


string StringTokenizer::nextToken(const string& delimiter) {
if (token_str.length() == 0)
return "";

string tmp_str = "";
unsigned int pos = token_str.find(delimiter,0);

if (pos != string::npos) {
tmp_str = token_str.substr(0,pos);
token_str = token_str.substr(pos + delimiter.length(),token_str.length() - pos);
}
else {
tmp_str = token_str.substr(0,token_str.length());
token_str = "";
}

return tmp_str;
}


string StringTokenizer::remainingString() {
return token_str;
}


string StringTokenizer::filterNextToken(const string& filterStr) {
string tmp_str = nextToken();
unsigned int currentPos = 0;

while((currentPos = tmp_str.find(filterStr,currentPos)) != string::npos) {
tmp_str.erase(currentPos,filterStr.length());
}

return tmp_str;
}

#endif

发表于: 2007-03-06,修改于: 2007-08-29 11:59,已浏览1003次,有评论0条 推荐 投诉


网友评论
 发表评论