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、