【问题标题】:A better way of parsing a string for numbers in brackets?解析括号中数字的字符串的更好方法?
【发布时间】:2016-02-27 15:55:07
【问题描述】:

我已尝试在此处/Google 上进行搜索,以找到一种更优化的方式来处理我需要处理的输入。这是一个例子……

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

这些数字是随机的,但我事先知道有多少个带括号的集合。另外,我确定格式将始终相同...

用括号括起来的6个数字

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

1) 占括号集合数量的外部 for 循环

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

【问题讨论】:

  • @seb 但是 OP 有两个问题。
  • 我会使用std::istringstreamstd::sscanf()
  • 谢谢大家。我也想过正则表达式,但不确定如何实现。雷米,我会看看两个谢谢!

标签: c++ parsing


【解决方案1】:

是的,我想说这太复杂了,原因很简单,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;

不用说,如果您“不确定”您的输入是否有效,则需要额外的工作。

【讨论】:

  • 谢谢!我会看看这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 2022-01-18
相关资源
最近更新 更多