解析数字直到逗号

  • 本文关键字:数字 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}

下面是你要求的草图(未编译,未测试):

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;
        }
}

对于此类任务,常见的解决方案是使用正则表达式:

#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, " "));
}

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

 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';
      }
    }
 }

最新更新