參考:http://www.cnblogs.com/oomusou/archive/2009/05/09/c_split.html
wstrings split(const wchar_t *str, const wchar_t *del )
{
int len = wcslen(str);
std::vector<wchar_t> tstr;
tstr.resize(len+1);
wcscpy(&tstr[0], str);
wstrings strs;
wchar_t *s = wcstok(&tstr[0], del);
while(s != NULL) {
strs.push_back(s);
s = wcstok(NULL, del);
}
return strs;
}
strings split(const char *str, const char *del )
{
int len = strlen(str);
std::vector<char> tstr;
tstr.resize(len+1);
strcpy(&tstr[0], str);
strings strs;
char *s = strtok(&tstr[0], del);
while(s != NULL) {
strs.push_back(s);
s = strtok(NULL, del);
}
return strs;
}
測試碼
strings ss = split("10,-20,-30", ",");
for (int i=0;i<ss.size();i++)
{
std::cout << ss[i] << std::endl;
}
修改後
strings split(const char *str, const char *del )
{
int len = strlen(str),
dlen = strlen(del),
lastindex = 0,
index = 0;
strings strs;
std::string tstr;
tstr.reserve(128);
int i;
for (i=0;i<len;i++)
{
for (int j=0;j<dlen;j++)
{
if (del[j] == str[i])
{
if (i-lastindex > 1)
{
tstr.assign(str+lastindex, str+i);
strs.push_back(tstr);
lastindex = i+1;
}
else
{
lastindex = i+1;
}
}
}
}
tstr.assign(str+lastindex, str+i);
strs.push_back(tstr);
return strs;
}
測試碼
strings ss2 = split("40,-50 -60.-70", ", .");
for (int i=0;i<ss2.size();i++)
{
std::cout << ss2[i] << std::endl;
}

1. 將一串東西指定給 STL Container 最簡單的方法是 std::vector tstr(str, str + strlen(str));
或
tstr.assign(str, str + strlen(str));
舉另一個例子,要把整個文字檔載入字串就像這樣
ifstream fin(...);
string s((istreambuf_iterator(fin)), istreambuf_iterator());
2. 你會寫成這樣應該是已經發現原作的重大缺陷了
(附帶一提,該作者的問題程式一堆,不過他既然不開放留言就算了)
strtok需要可寫空間,但是動態配置往往是效能大敵。這個問題其實不必額外配置可寫空間,只要掃描字串一次就夠了。
並且 strtok 是一個最好不要用的函數
你可以考慮使用 find_first_of 然後再仿製 std::string 的 find_first_not_of,就可以把 strtok 丟掉了
了解,我試試。