C++字符串解析

C++ string parsing

本文关键字:字符串 C++      更新时间:2023-10-16

全部:

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

现在,如果我有一个字符串,如"+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.

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

最佳,

由于字符串以冒号结尾,因此很容易使用findsubstr来分离由':'分割的字符串部分,如下所示:

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]))+))+