c++ - 为括号中的数字解析字符串的更好方法?

标签 c++ parsing

我已经尝试在此处/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());

最佳答案

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

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

关于c++ - 为括号中的数字解析字符串的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35671855/

相关文章:

c++ - 在 C++ 中使用 STL 生成成对项目的 vector

c# - 是否可以从 base64 格式解析证书?

Java CUP资源,还用着吗?

c++ - C++ 中的 printf 如何处理传递给它的参数?

c++ - 将 QString/std::string 转换为 QImage

c++ - 为什么我们需要为指针放置 *

c++ - MACRO 取决于其文件夹位置

c++ - 模板类自动类型转换的运算符重载

php 从 html 字符串中提取第一张图像,删除所有图像标签,并截断 html 字符串

java - 将 Guardians Complex JSON 解析为 Android 应用