解数直到逗号

时间:2016-04-24 18:56:12

标签: c++ parsing

我有一种格式,在字符串中,88将被解析为数字88,而8,8将被解析为两个8。我需要遍历字符串,并且对于每个.,将0推送到向量,否则根据上述规则将当前位置的数字推送到向量。零将永远不会出现在输入字符串中。我不想使用yacc或其他BNF解析器生成器;这对我的情况来说太过分了。最简单的方法是什么?这是我到目前为止所做的事情;它只是部分的,甚至没有编译:

for(int i=0; i<line.length(); i++){
  if (line[i] == '.')
    puzzle.push_back(0);
  else
    //do weird comma stuff
    //push stuff
}

示例:

line = ".1.1,1.11" puzzle = {0,1,0,1,1,0,11}

3 个答案:

答案 0 :(得分:1)

这里有一个草图,它看起来像你要求的(未编译,未经测试):

int value;
bool in_number = false;
while (cin.getline(line)) {
    for (int i = 0; i < line.length(); ++i)
        switch(line[i]) {
            case '.':
                if (in_number) {
                    puzzle.push_back(value);
                    in_number = false;
                }
                puzzle.push_back(0);
                break;
            case ',':
                if (in_number) {
                    puzzle.push_back(value);
                    in_number = false;
                }
                break;
            case '0': case '1': case '2': case '3': case '4':
            case '5': case '6': case '7': case '8': case '9':
                if (in_number) {
                    value *= 10;
                    value += line[i] - '0';
                } else {
                    in_number = true;
                    value = line[i] - '0';
                }
                break;
        }
}

答案 1 :(得分:1)

对于此类任务,常见的解决方案是使用regexp:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <regex>
#include <vector>

int main(int argc, char* argv[])
{
  std::string s(".1.1,1.11");
  std::smatch m;
  std::regex e("([0-9]+|\\.)[,]?");  
  std::vector<int> v;
  while (std::regex_search(s, m, e)) {
    const std::string& d = m[1];
    v.push_back(strtol(d.c_str(), 0, 10));
    s = m.suffix().str();
  }
  std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
}

答案 2 :(得分:0)

AntolyS的答案可能是最干净的,但是我选择了修改版的Pete Becker的答案,因为我是一个菜鸟,并且Antoly's有很多奇怪的事情发生了:

 int value; bool in_number = false;
 for(int i=0; i<line.length(); i++){
    if (line[i] == '.'){
      if (in_number){
    puzzle.push_back(value);
    in_number = false;
      }
      puzzle.push_back(0);
    }
    else if (line[i] == ','){
      if (in_number) {
    puzzle.push_back(value);
    in_number = false;
      }
    }
    else if (line[i] > '0' && line[i] <= '9'){
      if (in_number) {
    value *= 10;
    value += line[i] - '0';
      } else {
    in_number = true;
    value = line[i] - '0';
      }
    }
 }