gpt4 book ai didi

c++ - C++字符串表达式求解器运行冲突

转载 作者:行者123 更新时间:2023-12-03 09:13:18 25 4
gpt4 key购买 nike

我正在尝试创建一个将使用表达式(例如:“10 * 2 + 1”)的程序并对其进行求解。我的代码是:

#include <iostream>
#include <string>
#include <vector>

void calculateString(std::string str);

int main() {

calculateString("10*2+2");

system("pause");
}

void calculateString(std::string str) {
int total = 0;
std::string temp1 = "";
std::string temp2 = "";
std::string add = "";
std::string *ray = new std::string[str.length()];
std::vector<int> newRay;

for (int i = 0; i < str.length(); i++) {
if (str.at(i) != '*' && str.at(i) != '/' && str.at(i) != '+' && str.at(i) != '-') {
add += str.at(i);
}
else {
ray[i] = add;
std::cout << ray[i] << "\n";
add = "";
}
}
for (int i = 0; i < str.length(); i++) {
if (ray[i].compare("*")) {
total = atoi(ray[i - 1].c_str()) * atoi(ray[i + 1].c_str());
newRay.push_back(total);
}
}
for (int i = 0; i < str.length(); i++) {
if (ray[i] == "+") {
newRay.push_back(atoi(ray[i - 1].c_str()) + atoi(ray[i + 1].c_str()));
}
}
for (int i = 0; i < newRay.size(); i++) {
std::cout << newRay[i] << "\n";
total += newRay[i];
}
std::cout << str << "=" << total << "\n";
}

但是,每当我运行此命令时,我都会遇到以下访问冲突错误:

Exception thrown at 0x0F1CD4A0 (ucrtbased.dll) in CalcString.exe: 0xC0000005: Access violation reading location 0x01BE0FEE.



它指向第34行,这是: total = atoi(ray[i - 1].c_str()) * atoi(ray[i + 1].c_str());这基本上是在计算表达式的乘法部分,然后将asnwer存储在一个变量中。我已经尝试了所有方法,从将数组更改为 vector 到尝试重写所有方法,似乎没有任何效果。请帮忙

最佳答案


if (ray[i].compare("*"))

比较被滥用。 According to cppreference compare返回小于等于0,等于等于0,大于等于0。作为 if条件,0为false,其他所有条件为true,因此这解析为
if (ray[i] != "*")

可能与期望的相反。

if为“10”且 ray[0]为0时,这允许进入 i的主体,从而导致
total = atoi(ray[0 - 1].c_str()) * atoi(ray[0 + 1].c_str());

要么
total = atoi(ray[-1].c_str()) * atoi(ray[1].c_str());

并且访问负数组索引是未定义的行为。在这种情况下看起来像是崩溃。

解:

在这种情况下,我们关心的只是平等,因此我们可以摆脱
if (ray[i] == "*")

就像做的一样
if (ray[i] == "+")

我还建议检查一下以确保运算符绝不是 ray的第一个元素。

关于c++ - C++字符串表达式求解器运行冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41884964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com