How to split the strings in vc++?

后端 未结 6 1771
攒了一身酷
攒了一身酷 2021-01-24 03:10

I have a string \"stack+ovrflow*newyork;\" i have to split this stack,overflow,newyork

any idea??

相关标签:
6条回答
  • 2021-01-24 03:48

    You can use _tcstok to tokenize the string based on a delimiter.

    0 讨论(0)
  • 2021-01-24 03:52

    This site has a string tokenising function that takes a string of characters to use as delimiters and returns a vector of strings.

    Simple STL String Tokenizer Function

    0 讨论(0)
  • 2021-01-24 03:53

    There is another way to split a string using c/c++ :

    First define a function to split a string:

    //pointers of the substrings, assume the number of fields will not be over 5
    char *fields[5];   
    //str: the string to splitted
    //splitter: the split charactor
    //return the real number of fields or 0 if any error exits
    int split(char* str, char *splitter)
    {
        if(NULL == str) 
        {
            return 0;
        }
    
        int cnt;
        fields[0] = str;
        for(cnt = 1; (fields[cnt] = strstr(fields[cnt - 1], splitter)) != NULL && 
                cnt < 5; cnt++)
        {
            *fields[cnt] = '\0';
            ++fields[cnt];
        }
        return cnt;
    }
    

    then you can use this function to split string as following:

    char* str = "stack+ovrflow*newyork;"
    split(str, "+");
    printf("%s\n", fields[0]); //print "stack"
    split(fields[1], "*");
    printf("%s\n", fields[0]); //print "ovrflow"
    split(fields[1], ";");
    printf("%s\n", fields[0]); //print "newyork"
    

    this way will be more efficient and reusable

    0 讨论(0)
  • 2021-01-24 03:58

    First and foremost if available, I would always use boost::tokenizer for this kind of task (see and upvote the great answers below)

    Without access to boost, you have a couple of options:

    You can use C++ std::strings and parse them using a stringstream and getline (safest way)

    std::string str = "stack+overflow*newyork;";
    std::istringstream stream(str);
    std::string tok1;
    std::string tok2;
    std::string tok3;
    
    std::getline(stream, tok1, '+');
    std::getline(stream, tok2, '*');
    std::getline(stream, tok3, ';');
    
    std::cout << tok1 << "," << tok2 << "," << tok3 << std::endl
    

    Or you can use one of the strtok family of functions (see Naveen's answer for the unicode agnostic version; see xtofls comments below for warnings about thread safety), if you are comfortable with char pointers

    char str[30]; 
    strncpy(str, "stack+overflow*newyork;", 30);
    
    // point to the delimeters
    char* result1 = strtok(str, "+");
    char* result2 = strtok(str, "*");
    char* result3 = strtok(str, ";");
    
    // replace these with commas
    if (result1 != NULL)
    {
       *result1 = ',';
    }
    if (result2 != NULL)
    {
       *result2 = ',';
    }
    
    // output the result
    printf(str);
    
    0 讨论(0)
  • 2021-01-24 03:59

    See boost tokenizer here.

    0 讨论(0)
  • 2021-01-24 04:04

    Boost tokenizer

    Simple like this:

    #include <boost/tokenizer.hpp>
    #include <vector>
    #include <string>
    std::string stringToTokenize= "stack+ovrflow*newyork;";
    boost::char_separator<char> sep("+*;");
    boost::tokenizer< boost::char_separator<char> > tok(stringToTokenize, sep);
    std::vector<std::string> vectorWithTokenizedStrings;
    vectorWithTokenizedStrings.assign(tok.begin(), tok.end());
    

    Now vectorWithTokenizedStrings has the tokens you are looking for. Notice the boost::char_separator variable. It holds the separators between the tokens.

    0 讨论(0)
提交回复
热议问题