C/C++.字符串分割

1、ZC:只测试使用了 自己改编的函数SplitStr_ZZ(...),其它的 未测试

#include <string>
#include <vector>
#include <algorithm>// std::replace_if
using namespace std;

// std__string 字符串切割 - 漆天初晓 - 博客园.html (https://www.cnblogs.com/tyche116/p/9377330.html// 用单字符作为分隔
vector<string> SplitStr(string strtem, char a)
{
    vector<string> strvec;

    string::size_type pos1, pos2;
    pos2 = strtem.find(a);
    pos1 = 0;
    while (string::npos != pos2)
    {
        strvec.push_back(strtem.substr(pos1, pos2 - pos1));

        pos1 = pos2 + 1;
        pos2 = strtem.find(a, pos1);
    }
    strvec.push_back(strtem.substr(pos1));
    return strvec;
}

// 由多个分隔符来分隔:
std::vector<std::string> SplitString(string _strSrc, string _strDelimiter, bool _bRepeatedCharIgnored)
{
    vector<string> resultStringVector;
    replace_if(_strSrc.begin(), _strSrc.end(),
        [&](const char& c)
    {
        if (_strDelimiter.find(c) != string::npos)
        { return true; } else { return false; }
    }/*pred*/, _strDelimiter.at(0));

    //将出现的所有分隔符都替换成为一个相同的字符(分隔符字符串的第一个)
    size_t pos = _strSrc.find(_strDelimiter.at(0));
    std::string addedString = "";
    while (pos != std::string::npos) {
        addedString = _strSrc.substr(0, pos);
        if (!addedString.empty() || !_bRepeatedCharIgnored) {
            resultStringVector.push_back(addedString);
        }
        _strSrc.erase(_strSrc.begin(), _strSrc.begin() + pos + 1);
        pos = _strSrc.find(_strDelimiter.at(0));
    }
    addedString = _strSrc;
    if (!addedString.empty() || !_bRepeatedCharIgnored) {
        resultStringVector.push_back(addedString);
    }
    return resultStringVector;
}

/*
C++ 分割字符串两种方法 - 盛开的石头 - 博客园.html(https://www.cnblogs.com/stonebloom-yu/p/6542756.html)
    2、通过使用strtok()函数实现
    原型:char *strtok(char *str, const char *delim);
    功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
    描述:strtok()用来将字符串分割成一个个片段。
        参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时 则会将该字符改为\0 字符。
        在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回被分割出片段的指针。
    其它:strtok函数线程不安全,可以使用strtok_r替代。
*/
vector<string> SplitStr_S(const string &str, const string &pattern)
{
    //const char* convert to char*
    char * strc = new char[strlen(str.c_str()) + 1];
    strcpy(strc, str.c_str());
    vector<string> resultVec;
    char* tmpStr = strtok(strc, pattern.c_str());
    while (tmpStr != NULL)
    {
        resultVec.push_back(string(tmpStr));
        tmpStr = strtok(NULL, pattern.c_str());
    }

    delete[] strc;

    return resultVec;
}

// ZC:上面是 查阅到的资料,下面是 我自己改编的代码

// ZC: 函数strtok(...)的参数 是只能一个字符作为分隔符?还是有什么通配符规则(类似正则表达式之类的)?没测试...
void SplitStr_ZZ(vector<string>& _vtr, char* _pc, char* _pcPattern)
{
    _vtr.clear();
    if ((_pc == NULL) || (_pcPattern == NULL))
        return;

    char* pc = strtok(_pc, _pcPattern);
    while (pc != NULL)
    {
        _vtr.push_back(string(pc));

        pc = strtok(NULL, _pcPattern);
    }

}

 

2、调用代码

int main(int argc, char *argv[])
{
    char* pc = (char*)"AAA=";
    int iLen = strlen(pc);
    char* pcc = new char[iLen +1];
    pcc[iLen] = '\0';
    memcpy(pcc, pc, iLen);

    vector<string> vtr;
    SplitStr_ZZ(vtr, pcc, (char*)"=");
    for (int i = 0; i < vtr.size(); i++)
    {
        printf("%s\n", vtr.at(i).c_str());
    }

    system("pause");
    return 0;
}

 ZC:注意点:(1)传给 strtok(...)的第一个参数不能是 常量(PE结构常量段),会报内存错误

 ZC:  (2)若 分隔符后面没有内容了,或 未分割字符串(例如分隔符为"B"的情况),则 返回的 vector只包含一个元素

3、

4、

5、

 

posted @ 2019-09-30 14:33  CppSkill  阅读(2086)  评论(0编辑  收藏  举报