2016-04-24 31 views
-1

我有一個格式,在一個字符串中,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

'line'是你的輸入,但實際上你的輸出是什麼?你同時談論逗號和點。這有點令人困惑。請提供相關的輸入示例和期望的輸出。 – Dialecticus

回答

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

不能用'if'(line [i]> ='0'&& line [i] <='9')'case'0':case'1'...'' –

+0

@RenéG - yes ,在'if ... else if ...'階梯中。不在開關中。對於像這樣的詞法分析器,我更喜歡一個switch語句,用一個函數來分類輸入。但是,如果... if ... else梯形圖也可以工作 –

+0

或者使用'isdigit()'來檢測數字?看起來像if-else-if梯子可能更高效(或更容易維護)。 –

1

對於這樣的任務共同解決方案是使用正則表達式:

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

AntolyS的答案可能是乾淨的,但我與皮特貝克爾的回答修改後的版本就因爲我是小白,並有許多奇怪的事情發生的事情與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'; 
     } 
    } 
}