1

Possible Duplicate:
How to split a string?

Hi,

I have a string say "1,0,1", how can i get the substring separated by comma operator.

Community
  • 1
  • 1
boom
  • 5,856
  • 24
  • 61
  • 96
  • http://stackoverflow.com/questions/599989/is-there-a-built-in-way-to-split-strings-in-c is a better duplicate. The first one asks specifically how to split on whitespace only. – jalf Aug 10 '10 at 15:57

3 Answers3

2

C++ doesn't have a built in function for doing exactly this. However, it can be implemented using either the std::string::find_first_of member function, or the non-member std::find.

Here's an example using the latter:

#include <string>
#include <vector>
#include <algorithm>


// given a string str, split it on every occurrence of the character delim
std::vector<std::string> tokenize(std::string str, char delim) {
    // store the results in a vector of strings
    std::vector<std::string> tokens;

    std::string::iterator end = str.end();
    std::string::iterator left = str.begin();
    for (;;) {
        // find the next occurrence of the delimiter
        std::string::iterator right = std::find(left, end, delim);
        // create a string from the end of last one up until the one we just foun
        tokens.push_back(std::string(left, right));
        // if we reached the end of the string, exit the loop
        if (right == end) { break; }
        // otherwise, start the next iteration just past the delimiter we just found
        left = right + 1;
    }
    return tokens;
}

// test program
int main() {
    std::string str = "foo, bar, baz";
    std::string str2 = "foo, bar, baz,";
    std::string str3 = "foo";
    std::string str4 = "";
    std::string str5 = ",";

    std::vector<std::string> tokens = tokenize(str, ',');
    std::vector<std::string> tokens2 = tokenize(str2, ',');
    std::vector<std::string> tokens3 = tokenize(str3, ',');
    std::vector<std::string> tokens4 = tokenize(str4, ',');
    std::vector<std::string> tokens5 = tokenize(str5, ',');
}

Of course there are a lot of border cases to handle, and this implementation might not do exactly what you want, but it should give you a starting point.

jalf
  • 243,077
  • 51
  • 345
  • 550
0

another way of doing this is by using strtok. This is a old c way but it still applies to the problem.

using <vector>
using <string>

char* token, line[512];
std::string tokenStr;
std::string lineStr = "0, 1, 2";
std::vector<std::string> commaSplit;
strcpy ( line, lineStr.c_str());

//Remove spaces and find the first instance of ','
token = strtok( line, " ," );
while(token != NULL)
{
    //Copy the token to a string
    tokenStr = token;

    //Add the token to the vector
    commaSplit.push_back(token);

    //Find next instance of the ,
    token = strtok(NULL, " ,");
}
Wesley
  • 2,921
  • 6
  • 27
  • 30
-1

Search google for an algorithm to explode or tokenize your string. It's trivial.

You can also check out the documentation and use available tools : http://www.cplusplus.com/reference/string/string/

A simple implementation could be :

void tokenize(const string & text, vector<string> & tokens, char delim)
{
  size_t length = text.size();
  string token = "";

  for(size_t i=0;i<length;i++)
  {
      if(text[i] != delim)
      {
        token += text[i];
      }
      else
      {
        if(token.size() > 0)
        {
          tokens.push_back(token);
        }
        token = "";
      }
  }
  tokens.push_back(token);
}
Guillaume Lebourgeois
  • 3,796
  • 1
  • 20
  • 23