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、