C++中String类的字符串分割实现
最近笔试,经常遇到需要对字符串进行快速分割的情景,主要是在处理输入的时候,而以前练习算法题或笔试,很多时候不用花啥时间考虑测试用例输入的问题。可是C++标准库里面没有像java的String类中提供的字符分割函数split ,着实不方便。那么怎么解决这个问题呢?整理了一些方法如下:
1.简洁高效的方法(不过只能包含一个分隔符):
- #include <vector>
- #include <string>
- #include <iostream>
- using namespace std;
- void SplitString(const string& s, vector<string>& v, const string& c)
- {
- string::size_type pos1, pos2;
- pos2 = s.find(c);
- pos1 = 0;
- while(string::npos != pos2)
- {
- v.push_back(s.substr(pos1, pos2-pos1));
- pos1 = pos2 + c.size();
- pos2 = s.find(c, pos1);
- }
- if(pos1 != s.length())
- v.push_back(s.substr(pos1));
- }
- int main(){
- string s = "a,b,c,d,e,f";
- vector<string> v;
- SplitString(s, v,","); //可按多个字符来分隔;
- for(vector<string>::size_type i = 0; i != v.size(); ++i)
- cout << v[i] << " ";
- cout << endl;
- //输出: a b c d e f
- }
当处理有空格的字符串时,还是很有用的!!
- 使用void SplitString(const string& s, vector<string>& v, const string& c),和将v作为返回值都是可以的!
2.可包含多个分隔符的实现方式
- #include <vector>
- #include <string>
- #include <iostream>
- using namespace std;
- vector<string> split(const string &s, const string &seperator){
- vector<string> result;
- typedef string::size_type string_size;
- string_size i = 0;
- while(i != s.size()){
- //找到字符串中首个不等于分隔符的字母;
- int flag = 0;
- while(i != s.size() && flag == 0){
- flag = 1;
- for(string_size x = 0; x < seperator.size(); ++x)
- if(s[i] == seperator[x]){
- ++i;
- flag = 0;
- break;
- }
- }
- //找到又一个分隔符,将两个分隔符之间的字符串取出;
- flag = 0;
- string_size j = i;
- while(j != s.size() && flag == 0){
- for(string_size x = 0; x < seperator.size(); ++x)
- if(s[j] == seperator[x]){
- flag = 1;
- break;
- }
- if(flag == 0)
- ++j;
- }
- if(i != j){
- result.push_back(s.substr(i, j-i));
- i = j;
- }
- }
- return result;
- }
- int main(){
- // string s = "a,b*c*d,e";
- string s;
- getline(cin,s);
- vector<string> v = split(s, ",*"); //可按多个字符来分隔;
- for(vector<string>::size_type i = 0; i != v.size(); ++i)
- cout << v[i] << " ";
- cout << endl;
- //输出: a b c d e
- }
方法三:用C语言中的strtok 函数来进行分割
原型: char *strtok(char *str, const char *delim);strtok函数包含在头文件<string.h>中,对于字符数组可以采用这种方法处理。
- #include <string.h>
- #include <stdio.h>
- int main(){
- char s[] = "a,b*c,d";
- const char *sep = ",*"; //可按多个字符来分割
- char *p;
- p = strtok(s, sep);
- while(p){
- printf("%s ", p);
- p = strtok(NULL, sep);
- }
- printf("\n");
- return 0;
- }
- //输出: a b c d
C++中String类的字符串分割实现的更多相关文章
- 100、Java中String类之字符串转为大写
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 113、Java中String类之字符串文本分割IP地址
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 114、Java中String类之字符串文本复杂二次拆分
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 112、Java中String类之字符串文本拆分为指定的个数
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 111、Java中String类之字符串文本全部拆分
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 110、Java中String类之字符串文本拆分
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 108、Java中String类之字符串文本替换
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 093、Java中String类之字符串是匿名对象
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 092、Java中String类之字符串内容比较
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
随机推荐
- C#异步编程のParallel(并行)
Parallel是循环中开启多线程 Stopwatch watch1 = new Stopwatch(); watch1.Start(); for (int i = 1; i <= 10; i+ ...
- [CQOI2018]交错序列
嘟嘟嘟 要是求交错序列的个数和就好了,那我一秒就能切. 换成这个,我就不会了. 我一直想枚举1的个数,然后算出在长度为\(n\)的序列里,有多少个合法的序列,然后又觉得这好像是什么插板法,但是每一个盒 ...
- 【ES6】let 命令
let命令 为es6新增命令,用来声明变量,类似于var,但是let所声明的变量,只在let命令所在的块级作用域内有效 块级作用域写法(ES6块级作用域允许任意嵌套): // 块级作用域写法 { le ...
- layui之日期和时间组件
参考文档:https://www.layui.com/doc/modules/laydate.html代码片段如下: layui.use('laydate', function(){ var layd ...
- Linux内核入门到放弃-锁与进程间通信-《深入Linux内核架构》笔记
内核锁机制 对整数的原子操作 <asm-arch/atomic.h> typedef struct {volatile int counter;} atomic_t; //初始化只能借助于 ...
- WPF---Binding学习(一)
转自:http://blog.csdn.net/lisenyang/article/details/18312199 1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储 ...
- [MicroPython]TurnipBit开发板旋转按钮控制直流电机转速
1.实验目的: 学习在PC机系统中扩展简单I/O 接口的方法 学习TurnipBit拼插编程 了解直流电机的工作原理 学习L298N的工作原理 学习TurnipBit扩展板L298N和按键模块的接线方 ...
- Java hashCode() equals()总结
1.hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的: 2.如果两个对象相同,就是适用于equals(j ...
- face recognition[angular/consine-margin-based][L2-Softmax]
本文来自<L2-constrained Softmax Loss for Discriminative Face Verification>,时间线为2017年6月. 近些年,人脸验证的性 ...
- jquery tooltip
这是个加了点淡入淡出效果的顶部tooltip控件,会自动消失 用法: <head> <title></title> <link href="base ...