c++字符串分割的方法
C++中经常需要对字符串按照分隔符进行分割以获得子串序列,子串的顺序与其在原字符串中出现的顺序一致。一般有两种需求场景:
(1)给定一个分隔符(单个字符或子串)分割字符串;
(2)给定一个或多个分隔符(单个字符),分割字符串。
当给定的分隔符不在原字符串中,则原字符串不被分割,返回单个元素为原字符串的vector。
注意,本文实现时,如果被分割后的子串为空串,则不计入最终的子串序列。比如原字符串是"a,b",分隔符为",",那么分割后的子串序列为[“a”,“b”],而不是[“a”,“”,“b”]。
1.单个分隔符(单个字符或子串)分割字符串
#include#include #include usingnamespacestd; //@brief:指定单个分隔符(单个字符或子串)分割字符串 //@param:src原字符串;delimiter分隔符,单个字符或子串 vector splitStr(conststring&src,conststring&delimiter){ std::vector vetStr; //入参检查 //1.原字符串为空或等于分隔符,返回空vector if(src==""||src==delimiter){ returnvetStr; } //2.分隔符为空返回单个元素为原字符串的vector if(delimiter==""){ vetStr.push_back(src); returnvetStr; } string::size_typestartPos=0; autoindex=src.find(delimiter); while(index!=string::npos){ autostr=src.substr(startPos,index-startPos); if(str!=""){ vetStr.push_back(str); } startPos=index+delimiter.length(); index=src.find(delimiter,startPos); } //取最后一个子串 autostr=src.substr(startPos); if(str!=""){ vetStr.push_back(str); } returnvetStr; }
测试如下:
intmain(intargc,char*argv[]){
stringstr="I,love,China";
//正常分割
autovetStr=splitStr(str,",");
cout<<"vetStr.size()="<
输出结果:
vetStr.size()=3
IloveChina
vetStr.size()=1
love,China
vetStr.size()=1
I,love,China
2.单个或多个分隔符(单个字符)分割字符串
实现和单个分隔符(单个字符或子串)分割字符串基本一致,关键地方是将获取分隔符下标的函数由std::string::find(…)改为std::string::find_first_of(…)。二者的区别如下:
std::string::find(...)
将分隔符看作一个整体在原字符串中查找并返回匹配的下标,比如string("IloveChina").find("love")返回2。
std::string::find_first_of(...)
在字符串中搜索分隔符中任意一个字符出现的第一个位置。与std::string::find(...)的区别是不需要整个分隔符匹配,只需要分隔符中的单个字符匹配即可。
具体实现如下:
//@brief:指定单个或多个分隔符(单个字符)分割字符串
//@param:src原字符串;delimiter单个或多个分隔符(单个字符)
vectorsplitStr(conststring&src,conststring&delimiter){
std::vectorvtStr;
//入参检查
//1.原字符串为空返回空vector
if(src==""){
returnvtStr;
}
//2.分隔符为空返回单个元素为原字符串的vector
if(delimiter==""){
vtStr.push_back(src);
returnvtStr;
}
string::size_typestartPos=0;
autoindex=src.find_first_of(delimiter);
while(index!=string::npos){
autostr=src.substr(startPos,index-startPos);
if(str!=""){
vtStr.push_back(str);
}
startPos=index+1;
index=src.find_first_of(delimiter,startPos);
}
//取最后一个子串
autostr=src.substr(startPos);
if(str!=""){
vtStr.push_back(str);
}
returnvtStr;
}
测试如下:
intmain(intargc,char*argv[]){
stringstr="I,love,China";
//正常分割。按照h与逗号分割
autovetStr=splitStr(str,"h,");
cout<<"vetStr.size()="<
输出结果:
vetStr.size()=4
IloveCina
vetStr.size()=1
,love,Chin
vetStr.size()=1
I,love,China
3.反面实例
下面是我情急之下实现的单个或多个分隔符(单个字符)分割字符串的函数,有点“脏乱差”,作为反面教材,希望能够帮助大家时刻记住代码的简洁与优雅是多么可贵,大家可以对比感受一下。另外,适当的代码注释,对提高代码的可读性会有很大帮助。
脏乱差版本一:
//qsort函数需要的比较函数,按照升序排序
intcomp(constvoid*a,constvoid*b){
return*(int*)a-*(int*)b;
}
//@brief:指定单个或多个分隔符(单个字符)分割字符串
//@param:src原字符串;delimiter分隔符集合
vectorsplitStr(conststring&src,conststring&delimiter){
vectorstrRes;
intmaxSubstrNum=src.size();
int*pos=newint[maxSubstrNum];
memset(pos,0,maxSubstrNum*sizeof(int));
intj=0;
for(size_ti=0;i
代码主要说明:
(1)利用find()和substr()函数实现分割功能;
(2)代码中,需要对分割符出现的下标进行排序,这样才能顺序取出子串。
脏乱差版本二:
//@brief:指定单个或多个分隔符(单个字符)分割字符串
//@param:src原字符串;delimiter分隔符集合
std::vectorsplitStr(conststd::string&sStr,conststd::string&sSep){
std::vectorvt;
std::string::size_typepos=0;
std::string::size_typepos1=0;
intpos_tmp=-1;
while(true){
std::strings;
std::strings1;
pos1=sStr.find_first_of(sSep,pos);
if(pos1==std::string::npos){
if(pos+1<=sStr.length()){
s=sStr.substr(-1!=pos_tmp?pos_tmp:pos);
s1="";
}
}elseif(pos1==pos&&(pos1+1==sStr.length())){
s="";
s1="";
}else{
s=sStr.substr(-1!=pos_tmp?pos_tmp:pos,pos1-(-1!=pos_tmp?pos_tmp:pos));
s1=sStr.substr(pos1+1);
if(-1==pos_tmp){
pos_tmp=pos;
}
pos=pos1;
}
if(!s.empty()){
vt.push_back(s);
}
pos_tmp=-1;
if(pos1==std::string::npos){
break;
}
pos++;
}
returnvt;
}
以上就是c++字符串分割的方法的详细内容,更多关于C++字符串分割的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。