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