我想可以为你调试它,但从长远来看这对你没有帮助。这就是你要做的。
在每一行之后,放置一个 printf() 或 cout 语句,将更改的变量转储到标准输出。然后运行您的代码,将一组简单的参数传递给它:
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. :