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之间的一些现有的破折号),但是您不会注意到,因为它们是已经破折号)。