stringsplit之c++

#include <string>
#include <vector>

using namespace std;

// trim from start 
std::string &ltrim(std::string &s) {
    string::size_type n = s.find_first_not_of(" \r\n\t");
    if (n != string::npos)
    {
        s.erase(0, n);
    }
    else
    {
        s = "";
    }
    return s;
}

// trim from end 
std::string &rtrim(std::string &s) {
    string::size_type n = s.find_last_not_of(" \r\n\t");
    if (n != string::npos)
    {
        s.erase(n + 1, s.size() - n);
    }
    else
    {
        s = "";
    }
    return s;
}

std::string &trim(std::string &s) {
    return ltrim(rtrim(s));
}

int stringsplit(const std::string& src, const std::string& separator, std::vector<std::string>& dest, bool btrim_all = true)
{
    dest.clear();

    string str = src;
    if (trim(str).size() <= 0)
        return 0;

    // 首先找到第一个非分隔符的位置
    auto it = str.find_first_not_of(separator, 0);
    if (it == string::npos)
    {
        return 0;
    }
    // 去除左边所有的分隔符
    str = str.substr(it);

    string substring;
    string::size_type start = 0, index = 0;

    do
    {
        index = str.find_first_of(separator, start);
        if (index != string::npos)
        {
            substring = str.substr(start, index - start);
            if (btrim_all) trim(substring);
            if (substring.size() > 0) dest.push_back(substring);
            start = str.find_first_not_of(separator, index);
        }
        else
        {
            //the last token
            substring = str.substr(start);
            if (btrim_all) trim(substring);
            if (substring.size() > 0) dest.push_back(substring);
            break;
        }
    } while (start != string::npos);

    return dest.size();
}

void printVector(const std::string& src, std::vector<std::string>& dest)
{
    printf("src = %s\n", src.c_str());
    printf("count = %d\n", dest.size());

    for (auto it = dest.begin(); it != dest.end(); ++it)
    {
        printf("%s\n", it->c_str());
    }

    printf("-----------------------------\n");
}

int main()
{
    std::string separator = ",";
    std::string src;
    std::vector<std::string> dest;

    src = "ab,cd,ef";
    stringsplit(src, separator, dest);
    printVector(src, dest);

    src = "ab";
    stringsplit(src, separator, dest);
    printVector(src, dest);

    src = ",a b,, , cd ,ef,";
    stringsplit(src, separator, dest);
    printVector(src, dest);

    src = ",";
    stringsplit(src, separator, dest);
    printVector(src, dest);

    src = ",,,";
    stringsplit(src, separator, dest);
    printVector(src, dest);

    src = "";
    stringsplit(src, separator, dest);
    printVector(src, dest);

    src = " ";
    stringsplit(src, separator, dest);
    printVector(src, dest);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值