-1

全部:

我在字符串解析中遇到了一个问题:

现在,如果我有一个像“+12+400-500+2:+13-50-510+20-66+20:”这样的字符串

我该怎么做才能计算每个段的总和(:可以被认为是一个段的结尾)。目前,我能弄清楚的只是使用 for 循环并检查 +/- 符号,但我认为用通用方法解决此类问题并不好:(

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.

对于大多数新手来说,我真的不认为这是一个非常简单的问题,而且我会声称这不是一个家庭作业。:)

最好的,

4

4 回答 4

3

由于字符串以冒号结尾,因此使用起来很容易,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:

由于istreams 采用前导加号和前导减号,您可以使用运算符解析出数字>>

istringstream iss(expr);
while (iss) {
    int n;
    iss >> n;
    cout << n << endl;
}

有了这两个部分,您可以轻松地将各个数字相加,并产生所需的输出。这是一个快速演示

于 2013-05-01T22:14:45.040 回答
1

您需要将操作数和运算符分开。为此,您可以使用两种队列数据类型,一种用于操作数,一种用于运算符

于 2013-05-01T22:03:50.183 回答
0

由 分割:,然后由分割,然后+由分割-。翻译成int你就在那里。

于 2013-05-01T22:08:50.910 回答
0

你的表达语言看起来很规则:你可以使用一个正则表达式库——比如boost::regex——直接匹配组中的数字、符号和段,比如

 ((([+-])([0-9]+))+)(:((([+-])([0-9]))+))+
于 2013-05-01T22:27:51.790 回答