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、

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM