您的位置:首页 > 其它

GetSubString获取取指定子串和拆分字符串的函数GetSubStr

2009-10-10 21:11 471 查看
#include<string>

using namespace std;


// 获取以ch间隔的第n个子字符串:标准版(取子串)

// 参数为:原始串,分隔符,位置(zero base)
string GetSubStr(const string &strData, char ch, int nLocation)
{
//如果nLocation小于零,则返回空字符串
if(nLocation<0){
return string();
}

//开始处理
const string strDataProcess = strData+ch;
int nLenght(0);

//对于获得第一个位置(nLocation==0)的情况
if(nLocation==0){//获取第一个
nLenght = (int)strDataProcess.find(ch,-1+1);
string strProcess;
if(nLenght >0){
strProcess=strDataProcess.substr(-1+1,nLenght);
}
return strProcess;
}

//其它情况:定位
int nIndex(0),bStartPos(-1),nEndPos(0);
while(nIndex < nLocation){
nIndex ++;
bStartPos = (int)strDataProcess.find(ch,bStartPos + 1);
//提供的位置参数(nLocation)超出了字符串范围
if(bStartPos == string::npos)
return string();
};

//获得子字符串的结尾位置
nEndPos = (int)strDataProcess.find(ch,bStartPos + 1);
//提供的位置参数(nLocation)超出了字符串范围
if(nEndPos == string::npos)
return string();

//取得子串
nLenght = nEndPos - bStartPos -1;
string strProcess;
if (nLenght > 0 ){
strProcess = strDataProcess.substr(bStartPos+1,nLenght);
}
return strProcess;
}



// 以指定的字符拆分字符串:vector容器版本,由于接口一致,将容器替换为list同样可以
int GetSubStr(const string &strData, char ch, vector<string> &v)
{
v.clear();
if(strData.empty())
return 0;

if(strData.find(ch)==string::npos){
v.push_back(strData);
return 1;
}

//开始处理
size_t nStartPos(0),nEndPos(0);

while(nEndPos!=string::npos){
nEndPos = (int)strData.find(ch,nStartPos);
//提供的位置参数(nLocation)超出了字符串范围
if(nEndPos == string::npos){
v.push_back(strData.substr(nStartPos));
break;
}
v.push_back(strData.substr(nStartPos,nEndPos - nStartPos));

nStartPos = nEndPos+1;
};

return (int)v.size();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐