如何在c++中实现字符串分割函数split详解
前言
在学习c++中string相关基本用法的时候,发现了sstream的istringstream[1]可以将字符串类似于控制台的方式进行输入,而实质上这个行为等同于利用空格将一个字符串进行了分割,于是考虑到可以利用这个特性来实现c++库函数中没有的字符串分割函数split
stringsrc("Avatar1235.2TitanicK"); istringstreamistrStream(src);//建立src到istrStream的联系 strings1,s2; intn;doubled;charc; istrStream>>s1>>n>>d>>s2>>c; //以空格为分界的各数值则输入到了对应变量上
实现细节
目的是可以像js中一样,调用一个函数即可以方便地获取到处理完毕后的字符串数组,根据c++的实际情况再进行参数调整。
1.输入输出:
string*split(int&length,stringstr,constchartoken='')
返回:处理完的字符串数组的首地址
传入:字符串str、分隔符token(默认参数为空格)、以及引用参数length,指明处理完毕后动态分配的数组长度
2.数据透明处理:
由于istringstream会像cin一样,把空格视为数据间的界限,所以当分隔符不是空格时,需要将传入的分隔符换为空格,并且要提前对原有空格进行数据透明处理
字符替换利用了库algorithm中的replace()[2]
constcharSPACE=0; if(token!=''){ //先把原有的空格替换为ASCII中的不可见字符 replace(str.begin(),str.end(),'',SPACE); //再把分隔符换位空格,交给字符串流处理 replace(str.begin(),str.end(),token,''); }
假设输入字符串为:"ab,c,d,e,fg"
分隔符为非空格:','
则被替换为:"aSPACEbcdefSPACEg"
3.数据分割:
//实例化一个字符串输入流,输入参数即待处理字符串 istringstreami_stream(str); //将length置零 length=0; queueq; //用一个string实例s接收输入流传入的数据,入队并计数 strings; while(i_stream>>s){ q.push(s); length++; }
4.数组生成:
//根据计数结果动态开辟一个字符串数组空间 string*results=newstring[length]; //将队列中的数据转入数组中 for(inti=0;i完整代码
#include#include #include #include #include usingnamespacestd; string*split(int&length,stringstr,constchartoken=''){ constcharSPACE=0; if(token!=''){ replace(str.begin(),str.end(),'',SPACE); replace(str.begin(),str.end(),token,''); } istringstreami_stream(str); queue q; length=0; strings; while(i_stream>>s){ q.push(s); length++; } string*results=newstring[length]; for(inti=0;i 参考
[1]C++string类(C++字符串)完全攻略
[2]C++string替换指定字符
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。