C++字符串解析
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
,你就在那里。
您的表达式语言似乎很有规律:您可以使用正则表达式库(如boost::regex
(来直接匹配组中的数字、符号和段,例如
((([+-])([0-9]+))+)(:((([+-])([0-9]))+))+