解析括号中数字的字符串的更好方法是什么?

时间:2016-02-27 15:55:07

标签: c++ parsing

我已经尝试在这里搜索/ Google以找到处理我需要处理的输入的更优化方式。这是一个例子......

[1 5 0 50 100 60] [2 4 1 0 40 50]

这些数字是随机的但我知道预先有多少括号内的套装。另外,我肯定知道格式总是一样的......

括号括起来的6个数字

我已经有了一些工作,我将输入放到一行,然后我逐个字符地检查...

1)外部循环,用于计算括号内的数量

2)首先看看它是否是一个空格,'[',']'

3)如果不是,请获取该号码并存储

4)然后再次开始检查空间

5)存储下一个等等

6)直到我达到']'并继续循环

但我觉得需要有更好/更清晰的方法来处理解析。

示例代码......

    char c = line[position];

    while (c == '[' || c == ']' || cc == ' '){
        position++;
        c = line[position];
    }

    string firstStr;

    while (c != ' '){
        firstStr += c;
        position++;
        c = line[position];
    }

    first = atoi(firstStr.c_str());

    while (c == ' '){
        position++;
        ch = line[position];
    }

    string secondStr;

    while (c != ' '){
        secondStr += c;
        position++;
        c = line[position];
    }

    second = atoi(secondStr.c_str());

1 个答案:

答案 0 :(得分:2)

是的,我会说这太复杂了,原因很简单,因为C ++库已经包含了这里所需的所有算法的优化实现。

std::string line;

这是你的意见。现在,让我们解析它。

#include <algorithm>

auto b=line.begin(), e=line.end();

while ((b=std::find(b, e, '[')) != e)
{
    auto n_start=++b;

    b=std::find(b, e, ']');

    auto your_six_numbers_are_in_here=std::string(n_start, b);

    // Now, do whatever you want with your numbers.
}

由于您“确切知道”您的输入有效,因此输入验证的大多数方面都不再是问题,上述内容应该足够了。

your_six_numbers_are_in_here字符串可能包含也可能不包含前导或尾随空格。如何摆脱它们,以及如何提取实际数字是一项单独的任务。现在,既然你知道“肯定”你的输入是有效的,那么这就变成了一个简单的问题:

std::istringstream i(your_six_numbers_are_in_here);

int a, b, c, d, e, f;

i >> a >> b >> c >> d >> e >> f;

毋庸置疑,如果您不确定“输入有效”,则需要进行额外的工作。