icn icn - 1 month ago 14
C++ Question

c++ boost split string

I am using the

boost::split
method to split a string as this:

I first make sure to include the correct header to have access to
boost::split
:

#include <boost/algorithm/string.hpp>


then:

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


and the line is like

"test test2 test3"


This is how I consume the result string vector:

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


But why in the result
strs
I only get
"test2"
and
"test3"
, shouldn't be
"test"
,
"test2"
and
"test3"
, there are
\t
(tab) in the string.

Updated Apr 24th, 2011: It seemed after I changed one line of code at
printstrs
I can see the first string. I changed

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


to

cout<<*it<<endl;


And it seemed
"-------"
covered the first string somehow.

Answer

The problem is somewhere else in your code, because this works:

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;

and testing your approach, which uses a vector iterator also works:

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

Again, your problem is somewhere else. Maybe what you think is a \t character on the string, isn't. I would fill the code with debugs, starting by monitoring the insertions on the vector to make sure everything is being inserted the way its supposed to be.

Output:

* size of the vector: 3
test
test2
test3