Ok, I have this function that was provided by you guys, and it works, but I needed to tweak it a bit, and I can't seem to get it tweaked right. Trying to make it so it takes a 3rd parameter which takes an integer which will determine how many pieces it splits up into. For instance:

"This is a test to prove a point"

If i did this

``````std::vector<std::string> tokens = split("This is a test to prove a point",
"\t\n ", 4);``````

It would break it into 4 pieces as follows:

This
is
a
test to prove a point

So that it includes all of the remaining into the last piece of the split. I thought I had the logic right here, but I must be missing something, i have had a long day and can't think. Some help, or tell me its not possible? Ty :)

``````std::vector<std::string> split(const std::string& src, const std::string& delim, int numOfSplit)
{
using namespace std;
vector<string> result;
int i = 1;
int limit = src.size();
string::size_type startPos = 0, endPos = 0;
do{
endPos = src.find_first_of(delim,startPos);
string::size_type length = endPos - startPos;
if(length != 0)
result.push_back( src.substr(startPos,length) );
startPos = endPos + 1;
i++;
}while(i != numOfSplit);
string::size_type length = limit - startPos;
if(length != 0)
result.push_back(src.substr(startPos, length));
return result;
}``````
2
Contributors
1
3
Views
7 Years
Discussion Span
Last Post by ravenous

Try replacing the `do{ ... }while()` loop with a `for` loop, like:

``````for(unsigned i = 0; i < numOfSplit - 1; i++){
endPos = src.find_first_of(delim,startPos);
std::string::size_type length = endPos - startPos;
if(length != 0)
result.push_back( src.substr(startPos,length) );
startPos = endPos + 1;
}``````

This would also fix the hole in your code that lets the loop run indefinitely if sizes 0 or 1 are used!

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.