C++使用string函数及vector封装一个split函数
使用find函数及substr来将字符串根据分隔符分割之后输出到一个vector中,类似于python的split函数
/*****************************************
* Copyright (C) 2020 * Ltd. All rights reserved.
* File name : mysplit.cpp
* Created date: 2020-03-13 21:57:07
*******************************************/
#include <iostream>
#include <string>
#include <vector>
//using namespace std;
#define print(x) std::cout << __func__ << ">>" << __LINE__ << ">>" << #x << "# " << x << std::endl
std::vector<std::string> split(std::string &line, const std::string & delim)
{
size_t pstart = 0;
size_t phit = 0;
std::string sstr;
size_t length = line.length();
std::vector<std::string> vstr;
vstr.clear();
for (;pstart <= length;)
{
phit = line.find(delim, pstart);
if (std::string::npos != phit)
{
/* find delim, get substr */
sstr = line.substr(pstart, phit-pstart);
vstr.push_back(sstr);
pstart = phit + delim.size();
} else {
/* not find delim, append remaining str and break */
vstr.push_back(line.substr(pstart));
break;
}
}
return vstr;
}
size_t split(const std::string &line, const std::string &delim, std::vector<std::string> &vstr)
{
size_t pstart = 0;
size_t phit = 0;
std::string sstr;
size_t length = line.length();
vstr.clear();
for (;pstart <= length;)
{
phit = line.find(delim, pstart);
if (std::string::npos != phit)
{
/* find delim, get substr */
sstr = line.substr(pstart, phit-pstart);
vstr.push_back(sstr);
pstart = phit + delim.size();
} else {
/* not find delim, append remaining str and break */
vstr.push_back(line.substr(pstart));
break;
}
}
return vstr.size();
}
template <class T>
std::string join(T& val, std::string delim)
{
std::string str;
typename T::iterator it;
const typename T::iterator itlast = val.end()-1;
for (it = val.begin(); it != val.end(); it++)
{
str += *it;
if (it != itlast)
{
str += delim;
}
}
return str;
}
int main() {
//std::string str = "/usr/local/bin/";
std::string str="$GPRMC,200808.000,A,3114.4591,N,12118.0993,E,0.88,282.15,191220,,,A*61\n$GPGGA,200808.000,3114.4591,N,12118.0993,E,1,4,4.01,400.2,M,-26.8,M,,*7B\n$GPGSA,A,3,04,26,02,08,,,,,,,,,4.12,4.01,0.97*04\n$GPGSV,1,1,4,20,78,331,45,01,59,235,47,22,41,300,45,13,32,252,45*4A\n";
std::vector<std::string> vt;
//(void)split(str, "/", vt);
(void)split(str, "\n", vt);
std::vector<std::string>::iterator it;
std::string str2;
std::vector<std::string> vt2;
std::vector<std::string>::iterator it2;
for (it = vt.begin(); it != vt.end(); it++)
{
print("@@@@@@@@@@@@@@@@@@@@");
print(*it);
// continue;
str2 = *it;
(void)split(str2, ",", vt2);
print(vt2.size());
print("##############");
for (it2 = vt2.begin(); it2 != vt2.end(); it2++) {
print(*it2);
}
}
// join test
std::vector<std::string> vec(4, "good");
print(join(vec, "/"));
std::string jstr(6, '0');
print(join(jstr, "-"));
return 0;
}
程序运行结果
main>>57>>"@@@@@@@@@@@@@@@@@@@@"# @@@@@@@@@@@@@@@@@@@@
main>>58>>*it# $GPRMC,200808.000,A,3114.4591,N,12118.0993,E,0.88,282.15,191220,,,A*61
main>>62>>vt2.size()# 13
main>>63>>"##############"# ##############
main>>65>>*it2# $GPRMC
main>>65>>*it2# 200808.000
main>>65>>*it2# A
main>>65>>*it2# 3114.4591
main>>65>>*it2# N
main>>65>>*it2# 12118.0993
main>>65>>*it2# E
main>>65>>*it2# 0.88
main>>65>>*it2# 282.15
main>>65>>*it2# 191220
main>>65>>*it2#
main>>65>>*it2#
main>>65>>*it2# A*61
main>>57>>"@@@@@@@@@@@@@@@@@@@@"# @@@@@@@@@@@@@@@@@@@@
main>>58>>*it# $GPGGA,200808.000,3114.4591,N,12118.0993,E,1,4,4.01,400.2,M,-26.8,M,,*7B
main>>62>>vt2.size()# 15
main>>63>>"##############"# ##############
main>>65>>*it2# $GPGGA
main>>65>>*it2# 200808.000
main>>65>>*it2# 3114.4591
main>>65>>*it2# N
main>>65>>*it2# 12118.0993
main>>65>>*it2# E
main>>65>>*it2# 1
main>>65>>*it2# 4
main>>65>>*it2# 4.01
main>>65>>*it2# 400.2
main>>65>>*it2# M
main>>65>>*it2# -26.8
main>>65>>*it2# M
main>>65>>*it2#
main>>65>>*it2# *7B
main>>57>>"@@@@@@@@@@@@@@@@@@@@"# @@@@@@@@@@@@@@@@@@@@
main>>58>>*it# $GPGSA,A,3,04,26,02,08,,,,,,,,,4.12,4.01,0.97*04
main>>62>>vt2.size()# 18
main>>63>>"##############"# ##############
main>>65>>*it2# $GPGSA
main>>65>>*it2# A
main>>65>>*it2# 3
main>>65>>*it2# 04
main>>65>>*it2# 26
main>>65>>*it2# 02
main>>65>>*it2# 08
main>>65>>*it2#
main>>65>>*it2#
main>>65>>*it2#
main>>65>>*it2#
main>>65>>*it2#
main>>65>>*it2#
main>>65>>*it2#
main>>65>>*it2#
main>>65>>*it2# 4.12
main>>65>>*it2# 4.01
main>>65>>*it2# 0.97*04
main>>57>>"@@@@@@@@@@@@@@@@@@@@"# @@@@@@@@@@@@@@@@@@@@
main>>58>>*it# $GPGSV,1,1,4,20,78,331,45,01,59,235,47,22,41,300,45,13,32,252,45*4A
main>>62>>vt2.size()# 20
main>>63>>"##############"# ##############
main>>65>>*it2# $GPGSV
main>>65>>*it2# 1
main>>65>>*it2# 1
main>>65>>*it2# 4
main>>65>>*it2# 20
main>>65>>*it2# 78
main>>65>>*it2# 331
main>>65>>*it2# 45
main>>65>>*it2# 01
main>>65>>*it2# 59
main>>65>>*it2# 235
main>>65>>*it2# 47
main>>65>>*it2# 22
main>>65>>*it2# 41
main>>65>>*it2# 300
main>>65>>*it2# 45
main>>65>>*it2# 13
main>>65>>*it2# 32
main>>65>>*it2# 252
main>>65>>*it2# 45*4A
main>>57>>"@@@@@@@@@@@@@@@@@@@@"# @@@@@@@@@@@@@@@@@@@@
main>>58>>*it#
main>>62>>vt2.size()# 1
main>>63>>"##############"# ##############
main>>105>>*it2#
main>>111>>join(vec, "/")# good/good/good/good
main>>113>>join(jstr, "-")# 0-0-0-0-0-0