C++使用string函数及vector封装一个split及join函数

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

猜你喜欢

转载自blog.csdn.net/halazi100/article/details/104851793