相比PHP内置的explode()函数,c++还是要自己来搞
std::vector<std::string> explode(const std::string &src, char *szDivision)
{
/*strtok()是一个不安全的函数,因为其把剩余的子串存放到一个静态变量里,若多线程同时访问,则会出现错误。*/
std::vector<std::string> m_retVector;
/*strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了*/
std::string srcToken = src;
char *szToken = const_cast<char *>(srcToken.c_str());
char *pNextToken = nullptr;
char *szResult = strtok_s(szToken, szDivision, &pNextToken);
while (szResult != nullptr)
{
m_retVector.push_back(szResult);
szResult = strtok_s(NULL, szDivision, &pNextToken);
}
return m_retVector;
}
const std::vector<std::string> explodeV2(const std::string& s, const char& c)
{
std::string strBuffer("");
std::vector<std::string> m_vecRet;
for (auto n : s)
{
if (n != c)
strBuffer += n;
else
{
if (n == c && strBuffer != "")
{
m_vecRet.push_back(strBuffer);
strBuffer = "";
}
}
}
if (strBuffer != "")
m_vecRet.push_back(strBuffer);
return m_vecRet;
}
测试代码如下:
int main()
{
std::string strTest("the quick brown fox jumps over the lazy dog");
char sz[] = " ";
std::vector<std::string> v = explode(strTest, sz);
for (auto n : v)
std::cout << n << std::endl;
std::cout << "proof by explodeV2:" << std::endl;
std::vector<std::string> v2 = explodeV2(strTest, ' ');
for (auto n : v2)
std::cout << n << std::endl;
return 0;
}