c ++使用内置c / c ++使用多个分隔符解析字符串

时间:2013-05-29 06:39:44

标签: c++ string parsing

我正在尝试解析一个看起来像“1,4-6,8-10,12”的字符串,并将结果push_back转换为ints / char *的向量。在解析时,如果逻辑遇到4-6那么它应该在向量中推送4,5和6。我试图用strtok做这个,但它修改了输入字符串的唯一副本,所以我没有得到任何地方。我不能使用boost,否则tokenizer会非常简单有用。

2 个答案:

答案 0 :(得分:0)

std::stringstream ss("1,4-6,8-10,12");
std::vector<int> v;
int x;
while(ss >> x)
{
    v.push_back(x);
    char c;
    ss >> c; //will just discard a non space char.
    if(c != ',' || c != '-') ss.unget(); //... unless is just , or -
}

写下这篇文章的时间:1分钟。 是时候搜索一个合适的算法函数了:至少5分钟。

决定自己什么更有效率。

答案 1 :(得分:0)

#include <stlport\sstream>
#include <stlport\vector>
using namespace std;
...


stringstream ss("1,4-6,8-10,12");
vector<int> v;
int x, x2;
char c;

while (ss >> x)
{
    v.push_back(x);

    if (!(ss >> c))
        break;  // end of input string

    if (c == '-')
    {
        if (!(ss >> x2))
            throw;  // incorrect input string

        for (int i = x+1; i <= x2; i++)
            v.push_back(i);

        if (!(ss >> c))
            break;  // end of input string
    }
    else if (c != ',')
        throw; // incorrect input string
}

// check
int s = v.size();
// s = 8, v:{1,4,5,6,8,9,10,12}