c ++ boost分割string

我使用boost::split方法来分割一个string,如下所示:

我首先确保包含正确的头文件来访问boost::split

 #include <boost/algorithm/string.hpp> 

然后:

 vector<string> strs; boost::split(strs,line,boost::is_any_of("\t")); 

和线是一样的

 "test test2 test3" 

这是我如何使用结果string向量:

 void printstrs(vector<string> strs) { for(vector<string>::iterator it = strs.begin();it!=strs.end();++it) { cout << *it << "-------"; } cout << endl; } 

但为什么在结果strs我只能得到"test2""test3" ,不应该是"test""test2""test3" ,string中有\t (tab)。

2011年4月24日更新:在我更改了printstrs一行代码后,我可以看到第一个string。 我变了

 cout << *it << "-------"; 

 cout << *it << endl; 

它似乎"-------"以某种方式覆盖了第一个string。

问题是在你的代码中的其他地方,因为这个工作:

 string line("test\ttest2\ttest3"); vector<string> strs; boost::split(strs,line,boost::is_any_of("\t")); cout << "* size of the vector: " << strs.size() << endl; for (size_t i = 0; i < strs.size(); i++) cout << strs[i] << endl; 

并testing你的方法,它使用vector迭代器也工作:

 string line("test\ttest2\ttest3"); vector<string> strs; boost::split(strs,line,boost::is_any_of("\t")); cout << "* size of the vector: " << strs.size() << endl; for (vector<string>::iterator it = strs.begin(); it != strs.end(); ++it) { cout << *it << endl; } 

再一次,你的问题在别的地方。 也许你认为string上的字符不是。 我会用debugging来填充代码,首先监视向量上的插入操作,以确保所有内容都按照它应该插入的方式插入。

输出:

 * size of the vector: 3 test test2 test3 

我最好猜测你为什么遇到了—–覆盖你的第一个结果的问题是你实际上从文件中读取input行。 该行可能有一个\ r到最后,所以你结束了这样的事情:

-----------test2-------test3

发生了什么事是机器实际打印这个:

test-------test2-------test3\r-------

这意味着,由于test3结束时的回车,test3之后的破折号被打印在第一个单词的顶部(以及test和test2之间的一些现有的破折号),但是您不会注意到,因为它们是已经破折号)。