最近笔试,经常遇到需要对字符串进行快速分割的情景,主要是在处理输入的时候,而以前练习算法题或笔试,很多时候不用花啥时间考虑测试用例输入的问题。可是C++标准库里面没有像java的String类中提供的字符分割函数split ,着实不方便。那么怎么解决这个问题呢?整理了一些方法如下:

1.简洁高效的方法(不过只能包含一个分隔符):

  1. #include <vector>
  2. #include <string>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. void SplitString(const string& s, vector<string>& v, const string& c)
  7. {
  8. string::size_type pos1, pos2;
  9. pos2 = s.find(c);
  10. pos1 = 0;
  11. while(string::npos != pos2)
  12. {
  13. v.push_back(s.substr(pos1, pos2-pos1));
  14.  
  15. pos1 = pos2 + c.size();
  16. pos2 = s.find(c, pos1);
  17. }
  18. if(pos1 != s.length())
  19. v.push_back(s.substr(pos1));
  20. }
  21.  
  22. int main(){
  23. string s = "a,b,c,d,e,f";
  24. vector<string> v;
  25. SplitString(s, v,","); //可按多个字符来分隔;
  26. for(vector<string>::size_type i = 0; i != v.size(); ++i)
  27. cout << v[i] << " ";
  28. cout << endl;
  29. //输出: a b c d e f
  30. }

当处理有空格的字符串时,还是很有用的!!

  1. 使用void SplitString(const string& s, vector<string>& v, const string& c),和将v作为返回值都是可以的!

2.可包含多个分隔符的实现方式

  1. #include <vector>
  2. #include <string>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. vector<string> split(const string &s, const string &seperator){
  7. vector<string> result;
  8. typedef string::size_type string_size;
  9. string_size i = 0;
  10.  
  11. while(i != s.size()){
  12. //找到字符串中首个不等于分隔符的字母;
  13. int flag = 0;
  14. while(i != s.size() && flag == 0){
  15. flag = 1;
  16. for(string_size x = 0; x < seperator.size(); ++x)
  17.   if(s[i] == seperator[x]){
  18.   ++i;
  19.   flag = 0;
  20.    break;
  21.   }
  22. }
  23.  
  24. //找到又一个分隔符,将两个分隔符之间的字符串取出;
  25. flag = 0;
  26. string_size j = i;
  27. while(j != s.size() && flag == 0){
  28. for(string_size x = 0; x < seperator.size(); ++x)
  29.   if(s[j] == seperator[x]){
  30.   flag = 1;
  31.    break;
  32.   }
  33. if(flag == 0)
  34.   ++j;
  35. }
  36. if(i != j){
  37. result.push_back(s.substr(i, j-i));
  38. i = j;
  39. }
  40. }
  41. return result;
  42. }
  43.  
  44. int main(){
  45. // string s = "a,b*c*d,e";
  46. string s;
  47. getline(cin,s);
  48. vector<string> v = split(s, ",*"); //可按多个字符来分隔;
  49. for(vector<string>::size_type i = 0; i != v.size(); ++i)
  50. cout << v[i] << " ";
  51. cout << endl;
  52. //输出: a b c d e
  53. }

方法三:用C语言中的strtok 函数来进行分割

原型:  char *strtok(char *str, const char *delim);strtok函数包含在头文件<string.h>中,对于字符数组可以采用这种方法处理。

  1. #include <string.h>
  2. #include <stdio.h>
  3.  
  4. int main(){
  5. char s[] = "a,b*c,d";
  6. const char *sep = ",*"; //可按多个字符来分割
  7. char *p;
  8. p = strtok(s, sep);
  9. while(p){
  10. printf("%s ", p);
  11. p = strtok(NULL, sep);
  12. }
  13. printf("\n");
  14. return 0;
  15. }
  16. //输出: a b c d

参考文章:C++常见问题: 字符串分割函数 split

  

  

C++中String类的字符串分割实现的更多相关文章

  1. 100、Java中String类之字符串转为大写

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  2. 113、Java中String类之字符串文本分割IP地址

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  3. 114、Java中String类之字符串文本复杂二次拆分

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  4. 112、Java中String类之字符串文本拆分为指定的个数

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  5. 111、Java中String类之字符串文本全部拆分

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  6. 110、Java中String类之字符串文本拆分

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  7. 108、Java中String类之字符串文本替换

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  8. 093、Java中String类之字符串是匿名对象

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  9. 092、Java中String类之字符串内容比较

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

随机推荐

  1. C#异步编程のParallel(并行)

    Parallel是循环中开启多线程 Stopwatch watch1 = new Stopwatch(); watch1.Start(); for (int i = 1; i <= 10; i+ ...

  2. [CQOI2018]交错序列

    嘟嘟嘟 要是求交错序列的个数和就好了,那我一秒就能切. 换成这个,我就不会了. 我一直想枚举1的个数,然后算出在长度为\(n\)的序列里,有多少个合法的序列,然后又觉得这好像是什么插板法,但是每一个盒 ...

  3. 【ES6】let 命令

    let命令 为es6新增命令,用来声明变量,类似于var,但是let所声明的变量,只在let命令所在的块级作用域内有效 块级作用域写法(ES6块级作用域允许任意嵌套): // 块级作用域写法 { le ...

  4. layui之日期和时间组件

    参考文档:https://www.layui.com/doc/modules/laydate.html代码片段如下: layui.use('laydate', function(){ var layd ...

  5. Linux内核入门到放弃-锁与进程间通信-《深入Linux内核架构》笔记

    内核锁机制 对整数的原子操作 <asm-arch/atomic.h> typedef struct {volatile int counter;} atomic_t; //初始化只能借助于 ...

  6. WPF---Binding学习(一)

    转自:http://blog.csdn.net/lisenyang/article/details/18312199 1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储 ...

  7. [MicroPython]TurnipBit开发板旋转按钮控制直流电机转速

    1.实验目的: 学习在PC机系统中扩展简单I/O 接口的方法 学习TurnipBit拼插编程 了解直流电机的工作原理 学习L298N的工作原理 学习TurnipBit扩展板L298N和按键模块的接线方 ...

  8. Java hashCode() equals()总结

    1.hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的: 2.如果两个对象相同,就是适用于equals(j ...

  9. face recognition[angular/consine-margin-based][L2-Softmax]

    本文来自<L2-constrained Softmax Loss for Discriminative Face Verification>,时间线为2017年6月. 近些年,人脸验证的性 ...

  10. jquery tooltip

    这是个加了点淡入淡出效果的顶部tooltip控件,会自动消失 用法: <head> <title></title> <link href="base ...