我可能調試它給你,我想,但從長遠來看,這並不會幫助你。這就是你所做的。
在每行之後,將printf()或cout staement將已更改的變量轉儲到標準輸出。然後運行你的代碼,將一組簡單的參數傳遞給它:
vector<string> x = split ("Hello there, Bob.", ' ');
然後,檢查輸出,看看爲什麼你的實現不工作。你可能不得不跳出代碼,因爲如果它只是坐在那裏,你可能已經讓自己陷入了新的無限循環之中。
授人以魚,他會吃了一天,教一個人到魚,他永遠不會再捱餓。
或者特里·普拉切特版本:
給一個人一些火,他會一天是溫暖的,設置人上火,他會熱情爲其餘他的生命。
更新:
既然你說,你究竟做了什麼,我認爲,這裏是我從做發現。很明顯,當您在while
循環的末尾設置beg
到temp
時,它指向空間。這是通過在while
循環的頂部打印beg
字符串發現的 - 在提取第一個單詞後它從未改變。
然後,當您執行下一個find
時,它會發現完全相同的空間,而不是首先跳過空格,然後正確調用find
。您需要跳過每個find
之後的空格,確保您不會迭代超過字符串的末尾。
這是我的解決方案。如你所願使用它。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> split(const string &str, const char &delim) {
typedef string::const_iterator iter;
iter beg = str.begin();
vector<string> tokens;
while(beg != str.end()) {
//cout << ":" << beg._Myptr << ":" << endl;
iter temp = find(beg, str.end(), delim);
if(beg != str.end())
tokens.push_back(string(beg, temp));
beg = temp;
while ((beg != str.end()) && (*beg == delim))
beg++;
}
return tokens;
}
int main() {
vector<string> x = split ("Hello, my name is Bob. ", ' ');
return 0;
}
沒有在while
循環結束這個空間跳躍代碼,輸出爲:
:Hello, my name is Bob. :
: my name is Bob. :
: my name is Bob. :
: my name is Bob. :
: my name is Bob. :
: my name is Bob. :
: my name is Bob. :
: my name is Bob. :
等,循環往復。 隨着跳躍代碼,您可以:
:Hello, my name is Bob. :
:my name is Bob. :
:name is Bob. :
:is Bob. :
:Bob. :
順便說一句,在while循環內測試「beg!= str.end()」沒有意義。自從環路頂部開始測試條件後,您還沒有更改過乞討或str。此外,通過值而不是const引用傳遞char更爲常見。這些都不是bug,它們只是讓你的代碼更簡單易讀,而不會影響行爲。 – 2009-05-26 11:16:54