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.
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.
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.
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.
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
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With