2011-04-20 66 views
38

我使用boost::split方法来分割字符串作为这样的:C++助推分割字符串

我首先要确保包括正确的头能够访问boost::split

#include <boost/algorithm/string.hpp> 

则:

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

时线路等

"test test2 test3" 

这是我如何消费的结果字符串向量:

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",有\t(标签)的字符串。

更新于2011年4月24日:似乎在我改变了一行代码printstrs我可以看到第一个字符串。我改变

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

cout << *it << endl; 

,似乎"-------"覆盖的第一串莫名其妙。

+4

显示你如何使用矢量。我猜这个问题在那里。 – 2011-04-20 17:44:11

+9

'boost :: is_any_of(“\ t”)'效率低于'[](char c){return c =='\ t';}'。你只是想检查一个可能性。 (不知道为什么没有提升:是('\ t')') – MSalters 2013-08-26 10:33:35

+0

@MSalters评论中的代码是什么意思?我如何使用该代码来替代'boost :: is_any_of()'? – 2016-08-05 18:22:10

回答

52

问题是,别的地方在你的代码,因为这个工程:

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; 

和测试方法,它采用了矢量迭代器也可以工作:

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; 
} 

同样,你的问题是什么地方其他。也许你认为是字符串上的\t字符,不是。我会用调试来填充代码,首先监视向量上的插入操作,以确保所有内容都按照其应有的方式插入。

输出:

* size of the vector: 3 
test 
test2 
test3 
+2

如果您不会分享一个能够再现您所面临问题的最简单示例,那么我们无能为力。记住:最小的例子,而不是你的完整应用程序。 – karlphillip 2011-04-20 18:21:44

+0

@icn任何更新在你身边? – karlphillip 2011-04-21 03:13:25

+0

谢谢。它似乎我改变了cout << * it <<“-------”以cout << * it << endl;我可以看到第一个字符串。不知道为什么,它看起来“-------”覆盖了第一个字符串 – icn 2011-04-25 04:39:02

10

在为什么你不得不与-----覆盖你的第一个结果的问题我最好的猜测是,你实际上从文件中读取输入行。则该行可能有一个\ r上结束,所以你结束了这样的事情:

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

发生了什么是真正的印刷本机:

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

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