我有一种格式,在字符串中,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}
答案 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';
}
}
}