在学习c++中字符串相关基本用法的时候,发现了sstream的istringstream[1]可以将字符串类似于控制台的方式进行输入,而实质上这个行为等同于利用空格将一个字符串进行了分割,于是考虑到可以利用这个特性来实现c++库函数中没有的字符串分割函数分
字符串src(阿凡达123《泰坦尼克号》5.2 K); istringstream istrStream (src);//建立src到istrStream的联系 字符串s1, s2; int n;双d;字符c; istrStream祝辞祝辞s1祝辞祝辞n在祝辞d在祝辞s2祝辞祝辞c;//以空格为分界的各数值则输入到了对应变量上
目的是可以像js中一样,调用一个函数即可以方便地获取到处理完毕后的字符串数组,根据c++的实际情况再进行参数调整。
<强> 1。输入输出:强>
字符串*分裂(int&长度、字符串str const char牌=')
返回:处理完的字符串数组的首地址
传入:字符串str,分隔符令牌(默认参数为空格),以及引用参数长度,指明处理完毕后动态分配的数组长度
<强> 2。数据透明处理:强>
由于istringstream会像cin一样,把空格视为数据间的界限,所以当分隔符不是空格时,需要将传入的分隔符换为空格,并且要提前对原有空格进行数据透明处理
字符替换利用了库算法中的替代()[2]
const char空间=0; 如果令牌!=' '){//先把原有的空格替换为ASCII码中的不可见字符 取代(str.begin (), str.end(), ' ',空间);//再把分隔符换位空格,交给字符串流处理 替换(str.begin (), str.end(),令牌,' '); }
,假设输入字符串为:“a b, c, d, e, f g”
引用>
,分隔符为非空格:','
,则被替换为:“aSPACEb c d e fSPACEg”
<强> 3。数据分割:强>
//实例化一个字符串输入流,输入参数即待处理字符串 istringstream i_stream (str);//将长度置零 长度=0; queue问;//用一个字符串实例年代接收输入流传入的数据,入队并计数 字符串年代; ,而(i_stream>的在s) { q.push(年代); 长度+ +; } <强> 4。数组生成:强>
//根据计数结果动态开辟一个字符串数组空间 字符串*结果=新的字符串(长度);//将队列中的数据转入数组中 for (int i=0;我& lt;长度;我+ +){ 结果[我]=q.front ();//将替换掉的空格进行还原 如果令牌!=' ')取代(结果[我].begin(),(我)指标(),最终结果空间,' '); q.pop (); }
# include & lt; iostream> # include & lt; string> # include & lt; queue> # include & lt; sstream> # include & lt; algorithm> 使用名称空间性病; 字符串*分裂(int&长度、字符串str const char牌='){ const char空间=0; 如果令牌!=' '){ 取代(str.begin (), str.end(), ' ',空间); 替换(str.begin (), str.end(),令牌,' '); } istringstream i_stream (str); queue问; 长度=0; 字符串年代; ,而(i_stream>的在s) { q.push(年代); 长度+ +; } 字符串*结果=新的字符串(长度); for (int i=0;我& lt;长度;我+ +){ 结果[我]=q.front (); q.pop (); 如果令牌!=' ')取代(结果[我].begin(),(我)指标(),最终结果空间,' '); } 返回结果; }//测试: int main () { int长度; 字符串*结果=分裂(长度,“a b, c, d, e, f g”, ', '); for (int i=0;我& lt;长度;我+ +)cout<& lt;结果[我]& lt; & lt; endl; 返回0; }
[1] c++字符串类(C + +字符串)完全攻略
[2] c++字符串替换指定字符
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
如何在c++中实现字符串分割函数分裂详解