用了三种方法... #if 0 void StringTokenize(const std::string& strSrc, const std::string& strDelimit, std::vector<std::string>& vecSub) { if (strSrc.empty() || strDelimit.empty()) { throw "tokenize: empty string/n"; } vecSub.clear(); std::size_t nCurPos = 0; std::size_t nNextPos = 0; while ((nNextPos = strSrc.find_first_of(strDelimit, nCurPos)) != std::string::npos) { if (nNextPos - nCurPos > 0) { vecSub.push_back(strSrc.substr(nCurPos, nNextPos - nCurPos)); } nCurPos = nNextPos + 1; } // Add the last one std::string strLast = strSrc.substr(nCurPos); if (!strLast.empty()) vecSub.push_back(strSrc.substr(nCurPos)); } void StringToken(char *strToken, const char *strDelimit, std::vector<std::string>& vecSub) { assert(strToken && strDelimit && "Token, Delimit can not be NULL"); vecSub.clear(); char *pToken = strToken; char *pNextToken = NULL; pToken = strtok_s(pToken, strDelimit, &pNextToken); while (pToken != NULL) { vecSub.push_back(pToken); pToken = strtok_s(NULL, strDelimit, &pNextToken); } } #endif void StringTokenize(const std::string& strSrc, const std::string& strDelimit, std::vector<std::string>& vecSub) { if (strSrc.empty() || strDelimit.empty()) { throw "tokenize: empty string/n"; } vecSub.clear(); std::size_t nCurPos = 0; std::size_t nNextPos = 0; while ((nCurPos = strSrc.find_first_not_of(strDelimit, nNextPos)) != std::string::npos) { nNextPos = strSrc.find_first_of(strDelimit, nCurPos + 1); vecSub.push_back(strSrc.substr(nCurPos, nNextPos - nCurPos)); } } void TestStringToken() { std::string strToken(" C /t C++ | Python; C#...CPP"); std::string strDelimit(" /t|;."); std::vector<std::string> vecSub; StringTokenize(strToken, strDelimit, vecSub); std::copy(vecSub.begin(), vecSub.end(), std::ostream_iterator<std::string>(std::cout, "/n")); StringTokenize("abc", strDelimit, vecSub); assert(vecSub[0] == "abc"); StringTokenize("../t | ; . |", strDelimit, vecSub); assert(vecSub.empty()); }