我可能调试它给你,我想,但从长远来看,这并不会帮助你。这就是你所做的。
在每行之后,将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