Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ boost split string

Tags:

c++

split

boost

I'm 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.

like image 293
icn Avatar asked Apr 20 '11 17:04

icn


People also ask

Can you split a string in C?

Splitting a string using strtok() in C In C, the strtok() function is used to split a string into a series of tokens based on a particular delimiter. A token is a substring extracted from the original string.

What does .split do in C++?

The split() function exists in many programming languages to divide the string into multiple parts. There is no built-in split() function in C++ for splitting string but many multiple ways exist in C++ to do the same task, such as using getline() function, strtok() function, using find() and erase() functions, etc.

Is there a split method in C++?

Use strtok() function to split strings delim: It is a character that is used to split a string. For example, comma (,), space ( ), hyphen (-), etc. Return: It returns a pointer that references the next character tokens.


2 Answers

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 
like image 109
karlphillip Avatar answered Oct 06 '22 02:10

karlphillip


My best guess at why you had problems with the ----- covering your first result is that you actually read the input line from a file. That line probably had a \r on the end so you ended up with something like this:

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

What happened is the machine actually printed this:

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

That means, because of the carriage return at the end of test3, that the dashes after test3 were printed over the top of the first word (and a few of the existing dashes between test and test2 but you wouldn't notice that because they were already dashes).

like image 31
james Avatar answered Oct 06 '22 02:10

james