Is there a good reference online that describes all the nice things you can do with C++ strings? Is there a way to do a “split” on a C++ string like you can with Perl?
SGI has the STL documented online here.
Strings are here.
I can’t find any specific “split” method, but it’s easy enough to write one:
#include <string>
#include <list>
#include <iostream>
using namespace std;
list<string>* split_string(string* str, string::value_type split_on) {
list<string> *parts = new list<string>();
string::size_type lpos = 0;
while(1) {
string::size_type pos = str->find(split_on,lpos);
if(pos == str->npos) {
parts->push_back(str->substr(lpos));
break;
} else {
parts->push_back(str->substr(lpos, pos-lpos));
}
lpos = pos + 1;
}
return parts;
}
int main(int argc, char* argv[]) {
string test_string("Oboe,Bassoon,English Horn,Contrabassoon");
list<string> *parts = split_string(&test_string, ',');
list<string>::iterator substrings = parts->begin();
while(substrings != parts->end()) {
cout << *substrings++ << endl;
}
}
Note: I am NOT a C++ expert, I’m just now starting to play with the language after a long break. The above may have subtle bugs of the sort that plague C++ (in particular, I’m unsure if the call to substr returns a heap or stack allocated “string” instance)…
Based on Metacom’s code, it looks like strtok is the function you want. The best reference for C++ strings is an experienced programmer.
strtok is hard to get right, unless C++ has cleaned it up considerably. It keeps an internal state as to where it is in the string, meaning you are forced to split strings one at a time. If you call strtok on one string and then call it on another, the old state is lost.
strtok appears to be part of the cruft C++ picked up from C and shouldn’t be used lightly: It doesn’t operate on members of the string class, it operates on the nul-terminated arrays of char C uses instead of a true string type. If you don’t care about the overhead using the C++ library involves, try the code here or here (search in page for ‘Explode’).