4

Possible Duplicate:
How do I tokenize a string in C++?
Splitting a string in C++

Is there any python.split(",") like method in C++ please.

1

1 Answer 1

1

Got the following code from some where .. might help

#define MAIN 1
#include <string>
#include <vector>
#include <iostream>
using namespace std;

class splitstring : public string {
    vector<string> flds;
public:
    splitstring(char *s) : string(s) { };
    vector<string>& split(char delim, int rep=0);
};

vector<string>& splitstring::split(char delim, int rep) {
    if (!flds.empty()) flds.clear();
    string work = data();
    string buf = "";
    int i = 0;
    while (i < work.length()) {
        if (work[i] != delim)
            buf += work[i];
        else if (rep == 1) {
            flds.push_back(buf);
            buf = "";
        } else if (buf.length() > 0) {
            flds.push_back(buf);
            buf = "";
        }
        i++;
    }
    if (!buf.empty())
        flds.push_back(buf);
    return flds;
}

#ifdef MAIN
main()
{
    splitstring s("Humpty Dumpty sat on a wall.   Humpty Dumpty had a great fall");
    cout << s << endl;

    vector<string> flds = s.split(' ');
    for (int k = 0; k < flds.size(); k++)
        cout << k << " => " << flds[k] << endl;

    cout << endl << "with repeated delimiters:" << endl;
    vector<string> flds2 = s.split(' ', 1);
    for (int k = 0; k < flds2.size(); k++)
        cout << k << " => " << flds2[k] << endl;
}
#endif

In boost:

vector<string> results;
boost::split(results, line, boost::is_any_of("@"));

In STL:

template <typename E, typename C>
size_t split(std::basic_string<E> const& s, C &container,
        E const delimiter, bool keepBlankFields = true) {
    size_t n = 0;
    std::basic_string<E>::const_iterator it = s.begin(), end = s.end(), first;
    for (first = it; it != end; ++it) {
        if (delimiter == *it) {
            if (keepBlankFields || first != it) {
                container.push_back(std::basic_string<E > (first, it));
                ++n;
                first = it + 1;
            } else ++first;
        }
    }
    if (keepBlankFields || first != it) {
        container.push_back(std::basic_string<E > (first, it));
        ++n;
    }
    return n;
}
3
  • 7
    IMHO, it's very complicated for such a simple operation... Commented Jan 19, 2013 at 12:54
  • 1
    Of course simple method is there .. Use boost in two lines done .. Commented Jan 19, 2013 at 12:56
  • I think it'll be about 5-6 lines with only STL. Commented Jan 19, 2013 at 13:01