尽管更改了字符串,我的字符串返回一定数量

时间:2018-04-17 21:28:20

标签: c++ string undefined-behavior

我试图创建一个程序,该程序接受由自然数字组成的字符串并计算它们的总和。像1+443+986等等

这是代码:

char s[100] = "39+72+15";
int main()
{
    while(strlen(s) != 0)
    {
        i = 0;
        while((s[i] != '+') && (s[i] != '-'))
        {
            temp = temp * 10 + (s[i] - '0');
            i++;
        }
        cout << "temp = " << temp << endl;
        strcpy (s, s + i + 1);
        temp = 0;
    }
    return 0;
}

但是,无论我输入什么字符串值:

image

无论字符串中的最后一个数字如何,它都会将字符串中的最后一个数字转换为1877688504

我确定字符串的其余部分是空的,因此其中没有任何可能导致问题的垃圾。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您需要在内部while循环中添加对字符串末尾的检查。

目前您检查+或 - 但最后一个号码后面没有加号或减号。

更改

while((s[i] != '+') && (s[i] != '-'))

while((s[i] != '+') && (s[i] != '-') && s[i] != '\0') // '\0' is string terminator

应该解决你的问题。

答案 1 :(得分:0)

这是一种粗略的 C++ 标记代数表达式的方式:

// Example program
#include <iostream>
#include <string>
#include <queue>

int main()
{
  std::string ex = "39+72+15";
  std::queue<std::string> operand_stack;
  std::queue<std::string> operator_stack;

  // tokenize
  size_t ppos = 0;
  size_t cpos = 0;
  for (auto i = ex.begin();; ++i) {
     if (*i == '+' || *i == '-') {
        cpos = i - (ex.begin() + ppos);

        std::string operand = ex.substr(ppos, cpos);
        ppos = cpos + 1; // skip operator
        operand_stack.push(operand); // push integer operand

        std::string op(1, *i);
        operator_stack.push(op); // push operator: "+" or "-"

     } else if (i == ex.end()) {
        ppos = i - (ex.begin() + ppos) + 1; // skip operator

        // get last operand
        std::string operand = ex.substr(ppos, ex.length() - ppos);
        operand_stack.push(operand);
        break;
     }
  }

  // Assuming L->R, same precedence
  while (! operator_stack.empty()) {
     std::string op = operator_stack.front();
     operator_stack.pop();

     int lhs = std::stoi(operand_stack.front());
     operand_stack.pop();

     int rhs = std::stoi(operand_stack.front());
     operand_stack.pop();

     if (op == "+") {
        operand_stack.push(std::to_string(lhs + rhs));
     } else if (op == "-") {
        operand_stack.push(std::to_string(lhs - rhs));
     }
  }
  std::cout << "sum = " << operand_stack.front();
}