您的位置:首页 > 编程语言 > C语言/C++

c++ string split分割字符串

2017-12-03 16:19 483 查看
c++原生好像没有split分割字符串内置函数

#include <iostream>
#include <string>
#include <typeinfo>
#include <tuple>
#include <map>
#include <vector>
#include <thread>
#include <fstream>
using namespace std;

vector<string> split(string &str,string sp){
vector<string> split;
//string sp="age";
int ex=0;
for(int i=0;i<str.length();i++){
//比较最前面两个char字符,不相等直接再一下字符
if(str[i]!=sp[0]){
continue;
}
//如果开始两个相等那么再比较分隔字符串中下一个字符
//比较时候i是不增加的,用偏移量来,以防没有配匹退不回去
//++j是先增加一个直接比较第二个开始,因为前面第一个已经比较了
int j=1;
for(j=1;j<sp.length();j++){

if(str[i+j]!=sp[j]){
break;//还没有比较完分隔字符就不同了,所以直接退出这个
}
}

if(j==sp.length()){

split.push_back(str.substr(ex,i-ex));

i=i+j;
ex=i;
}

}
//剩下全部加入去
split.push_back(str.substr(ex,-1));
return move(split);
}


调用

int main() {
ifstream in("json.txt");
if(not in){
cout<<"json.txt not open!";
return -1;
}
string json;
getline(in,json);
in.close();
vector<string> ss=split(json,",");
for(auto & p:ss){
cout<<p<<endl;
}
return 0;
}


还可以加入去头去尾的,这样不会有空串

vector<string> split(string &str,string sp){
vector<string> split;
//string sp="age";
int ex=0;
for(int i=0;i<str.length();i++){
//比较最前面两个char字符,不相等直接再一下字符
if(str[i]!=sp[0]){
continue;
}
//如果开始两个相等那么再比较分隔字符串中下一个字符
//比较时候i是不增加的,用偏移量来,以防没有配匹退不回去
//++j是先增加一个直接比较第二个开始,因为前面第一个已经比较了
int j=1;
for(j=1;j<sp.length();j++){
if(str[i+j]!=sp[j]){
break;//还没有比较完分隔字符就不同了,所以直接退出这个
}
}

if(j==sp.length()){
if(i-ex>1)
split.push_back(str.substr(ex,i-ex));
ex=i+j;
i=i+j-1;
}

}
//剩下全部加入去
if(ex<str.length())
split.push_back(str.substr(ex,-1));
return move(split);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string c++ split