4.6. Splitting a String
Problem
You want to split a
delimited string into multiple strings. For example, you may want to split
the string "Name|Address|Phone" into three separate
strings, "Name“, "Address“, and "Phone“, with the delimiter
removed.
Solution
Use basic_string’s find member function to advance from one occurrence of the delimiter to the
next, and substr to copy each substring out of the
original string. You can use any standard sequence to hold the results; Example 4-10 uses a vector.
Example 4-10. Split a delimited string
#include <string>
#include <vector>
#include <functional>
#include <iostream>
using namespace std;
void split(const string& s, char c,
vector<string>& v) {
string::size_type i = 0;
string::size_type j = s.find(c);
while (j != string::npos) {
v.push_back(s.substr(i, j-i));
i = ++j;
j = s.find(c, j);
if (j == string::npos)
v.push_back(s.substr(i, s.length()));
}
}
int main() {
vector<string> v;
string s = "Account Name|Address 1|Address 2|City";
split(s, '|', v);
for (int i = 0; i < v.size(); ++i) {
cout << v[i] << '\n';
}
}Discussion
Making the example above a function template that accepts any kind of character is
trivial; just parameterize the character type and change references to string to basic_string<T>:
template<typename T> void split(const basic_string<T>& s, T c, vector<basic_string<T> >& v) { basic_string<T>::size_type i = 0; basic_string<T>::size_type j = s.find(c); while (j != basic_string<T>::npos) { v.push_back(s.substr(i, j-i)); i = ++j; ...