• 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的分割字符时 则会将该字符改为 字符。
            在第一次调用时,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] = '';
        memcpy(pcc, pc, iLen);
    
        vector<string> vtr;
        SplitStr_ZZ(vtr, pcc, (char*)"=");
        for (int i = 0; i < vtr.size(); i++)
        {
            printf("%s
    ", vtr.at(i).c_str());
        }
    
        system("pause");
        return 0;
    }

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

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

    3、

    4、

    5、

  • 相关阅读:
    ios 关闭自动修正输入内容
    Tarjan+缩点【强连通分量】【模板】
    初识Tarjan算法
    【尺取法】【转】
    【先加后减拼凑思想】【合成数问题】
    强连通分量【k 算法、t 算法】
    大数【加减乘除】
    洛谷博客地址【置顶!】
    差分约束+spfa【模板】
    【poj3169】【差分约束+spfa】
  • 原文地址:https://www.cnblogs.com/cppskill/p/11612627.html
Copyright © 2020-2023  润新知