Re: Alternative to strtok?
Dave Cullen wrote:
Is there a more elegant way of parsing a delimited string in C++
other than strtok? The equivalent to VB's String.Split would be nice.
The string being parsed is read from a file, and semicolon delimited.
Variable length (field count). Strtok seems crude, tho it certainly
works. I'm just wondering if there's an alternative to making 50
calls to a function.
VC6 (MFC) but not .NET
Another problem with strtok is that it modifies the input string. In some
(many? most?) circumstances, that's not desirable. Here's a simple STL
solution:
<code>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
void split_string(
const string& str,
char delimitter,
vector<string>& ret
)
{
string::size_type delim;
string::size_type prev_delim = 0;
while (string::npos != (delim = str.find_first_of(delimitter,prev_delim)))
{
ret.push_back(str.substr(prev_delim,delim-prev_delim));
prev_delim = delim+1;
}
// Get the tail after the last separator
ret.push_back(str.substr(prev_delim));
}
// example usage
int main(int argc, char* argv[])
{
if (3 > argc)
{
cerr << "usage: split_test pattern delimitter\n";
return 1;
}
vector<string> args;
split_string(argv[1],*argv[2],args);
cout << args.size() << " arguments:\n";
for (vector<string>::iterator it = args.begin(); it != args.end(); ++it)
cout << "'" << *it << "'\n";
}
</code>
I have no idea if it works with VC6's impaired STL since I stopped using
that compiler 5+ years ago.
-cd