现在的位置: 首页 > 综合 > 正文

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

2013年10月01日 ⁄ 综合 ⁄ 共 1520字 ⁄ 字号 评论关闭

 
#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();
}

 

抱歉!评论已关闭.