如何在vc ++中拆分字符串?

时间:2009-06-25 13:56:56

标签: c++ visual-c++

我有一个字符串“stack + ovrflow * newyork;”我必须拆分这个堆栈,溢出,newyork

任何想法?

6 个答案:

答案 0 :(得分:11)

首先,如果可以的话,我总是会使用boost :: tokenizer来完成这种任务(请参阅下面的upvote)

如果无法访问提升,您可以选择以下几种方法:

您可以使用C ++ std :: strings并使用stringstream和getline(最安全的方式)解析它们

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

或者您可以使用strtok系列函数之一(请参阅Naveen对unicode不可知版本的回答;如果您对char指针感到满意,请参阅下面的xtofls评论以获取有关线程安全的警告)

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);

答案 1 :(得分:6)

Boost tokenizer

这样简单:

#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());

现在,vectorWithTokenizedStrings拥有您正在寻找的标记。注意boost :: char_separator变量。它保存令牌之间的分隔符。

答案 2 :(得分:4)

请参阅boost tokenizer here

答案 3 :(得分:2)

您可以使用_tcstok根据分隔符对字符串进行标记。

答案 4 :(得分:2)

此网站有一个字符串标记功能,它将一串字符用作分隔符并返回字符串向量。

Simple STL String Tokenizer Function

答案 5 :(得分:2)

还有另一种使用c / c ++分割字符串的方法:

首先定义一个拆分字符串的函数:

//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;
}

然后你可以使用这个函数来分割字符串,如下所示:

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"

这种方式将更有效和可重复使用