2016-02-27 46 views
0

我试过在这里搜索/谷歌找到一个更好的方式来处理我需要处理的输入。这是一个例子...为括号中的数字解析字符串的更好方法?

[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()); 
+1

只需使用正则表达式? –

+1

@seb但是然后OP有两个问题。 – Yakk

+0

我会使用'std :: istringstream'或'std :: sscanf()' –

回答

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; 

不言而喻,如果你不知道“肯定”,你的投入会有效的,在这里需要额外的工作。

+0

谢谢!我会看一看。 – cpd1