忽略字符串流中的空格不适用于skipws标志

时间:2019-09-17 17:16:57

标签: c++ string stringstream

我正在尝试解决一个问题,该问题需要对类似10+20的字符串中的简单表达式求值,而该返回值应返回30

问题是字符串可以包含空格,因此我将stringstringskipws标志一起使用,它适用于字符串中的空格,例如10 + 20等,但是当空格结尾时它没有正确通过。

这就是我解析字符串的方式

void build_stack(const string& str) {
    istringstream ss(str);

    char op;
    int op1, op2;
    ss>>skipws>>op1;
    operands.push(op1);
    while(!ss.eof()) {
        ss>>op;
        operators.push(op);
        ss>>op2;
        operands.push(op2);
    }
}

具有各种字符串输入here in rextester的完整代码。

当字符串为3+5 / 2时,我的堆栈将以 operands => 2 2 5 3 operators => / / +

当字符串为3+5 / 2(即带有尾随空格)时,我的堆栈将构建为 operands => 2 5 3 operators => / +

我尝试过

while(ss.peek() == ' ') {
    char c; ss>>c;
}

但这是在看到空格后删除所有字符。

1 个答案:

答案 0 :(得分:0)

示例"3+5 / 2 "

  1. ss>>skipws>>op1;

    3被写入op1

  2. operands.push(op1);

    op1被推入operands

  3. while(!ss.eof()) {

    是真的

  4. ss>>op;

    +被写入op

  5. operators.push(op);

    op被推入operators

  6. ss>>op2;

    5被写入op2

  7. operands.push(op2);

    op2被推入operands

  8. while(!ss.eof()) {

    是真的

  9. ss>>op;

    /被写入op

  10. operators.push(op);

    op被推入operators

  11. ss>>op2;

    2被写入op2

  12. operands.push(op2);

    op2被推入operandsss包含空格,不能为空

  13. while(!ss.eof()) {

    是真的

  14. ss>>op;

    无法读取,/停留在op,已设置eof

  15. operators.push(op);

    op被推入operators

  16. ss>>op2;

    无法读取,2停留在op2

  17. operands.push(op2);

    op2被推入operands

  18. while(!ss.eof()) {

    是错误的

与示例"3+5 / 2"相比:

  1. ss>>skipws>>op1;

    3被写入op1

  2. operands.push(op1);

    op1被推入operands

  3. while(!ss.eof()) {

    是真的

  4. ss>>op;

    +被写入op

  5. operators.push(op);

    op被推入operators

  6. ss>>op2;

    5被写入op2

  7. operands.push(op2);

    op2被推入operands

  8. while(!ss.eof()) {

    是真的

  9. ss>>op;

    /被写入op

  10. operators.push(op);

    op被推入operators

  11. ss>>op2;

    2被写入op2

  12. operands.push(op2);

    op2被推入operandsss为空,设置为eof

  13. while(!ss.eof()) {

    是错误的

您可以使用

对其进行修复
void build_stack(const string& str) {
    istringstream ss(str);

    char op;
    int op1, op2;
    ss>>skipws>>op1;
    operands.push(op1);
    while(true) {
        if (!(ss>>op)) break;
        operators.push(op);
        if (!(ss>>op2)) break;
        operands.push(op2);
    }
}