[英]C++ string parsing
所有:
我在字符串解析中遇到一個問題:
現在,如果我有一個字符串,例如“ + 12 + 400-500 + 2:+ 13-50-510 + 20-66 + 20:”
我該如何計算每個細分的總和(:可以視為一個細分的結尾)。 就目前而言,我能弄清楚的只是用於遍歷和檢查+/-符號,但是我認為通用方法解決此類問題並不好:(
For example, the first segment, +12+400-500+2 = -86, and the second segment is
+13-50-510+20-66+20 = -573
1) The number of operand is varied( but they are always integer)
2) The number of segment is varied
3) I need do it in C++ or C.
對於大多數新手來說,我並不認為這是一個非常簡單的問題,而且我將聲稱這不是一項家庭作業。 :)
最好,
由於字符串以冒號結尾,因此很容易使用find
和substr
來分隔字符串中由':'
分隔的部分,如下所示:
string all("+12+400-500+2:+13-50-510+20-66+20:");
int pos = 0;
for (;;) {
int next = all.find(':', pos);
if (next == string::npos) break;
string expr(all.substr(pos, (next-pos)+1));
cout << expr << endl;
pos = next+1;
}
這會將原始字符串分成幾部分
+12+400-500+2:
和
+13-50-510+20-66+20:
由於istream
的前導加號和前導減號,您可以使用>>
運算符解析出數字:
istringstream iss(expr);
while (iss) {
int n;
iss >> n;
cout << n << endl;
}
有了這兩部分,您可以輕松地將各個數字相加,並產生所需的輸出。 這是一個快速演示 。
您需要將操作數和運算符分開。 為此,您可以使用兩種隊列數據類型,一種用於操作數,另一種用於運算符
除以:
,然后除以+
,再除以-
。 轉換為int
,您就在那里。
您的表達語言似乎很常規:您可以使用regex庫-例如boost::regex
將數字,符號和段中的組直接匹配,例如
((([+-])([0-9]+))+)(:((([+-])([0-9]))+))+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.