ConsoleApplication1.exe中未处理的异常:Microsoft C ++异常:内存位置的{std :: invalid_argument

时间:2017-03-13 16:49:10

标签: c++ visual-studio c++11 visual-c++

我试图在Visual Studio中制作一个基本计算器,用户输入一个方程式,方程式通过将方程式作为一个字符串然后修改字符串来解决方程式来解决。但是当我把方程式我在调试时得到错误:

  

ConsoleApplication1.exe中0x00007FF9A1411F28处的未处理异常:   Microsoft C ++异常:内存位置的std :: invalid_argument   0x000000195B4FF680。

以下是代码:

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

void Calculation_div(string &str);

int main()
{
    string a;
    cin >> a;
    Calculation_div(a);
    cout << a;
}
void Calculation_div(string &str)
{
    std::size_t div_a;
    std::size_t div_r, div_l;
    while(str.find('/')) {
        div_a = str.find('/');
        if (str.find('/', div_a + 1)) {
        div_r = str.find('/', div_a + 1);
        }
        else {
            div_r = str.length();
        }
        if (str.rfind('/', div_a - 1) ) {
            div_l = str.rfind('/', div_a - 1) ;
        }
        else {
            div_l = 0;
        }
        string bi_l = str.substr(div_l, (div_a - div_l));
        string bi_r = str.substr(div_a+1, (div_r - div_a+1));
        int in_l = stoi(bi_l);
        int in_r = stoi(bi_r);
        int res_i = in_l + in_r;
        string res_s = std::to_string(res_i);
        str.replace(div_l, res_s.length(), res_s);
    }
}

1 个答案:

答案 0 :(得分:0)

对不起,菜鸟错了。事实证明我只是假设string.find会返回一个false值而不是string :: npos.I编辑了代码,这样它运行完美,没有任何错误

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

void Calculation(string &str);

int main()
{
string a;
cin >> a;
Calculation(a);
cout << a<<"\n";
system("PAUSE");
}
void Calculation(string &str)
{
std::size_t div_a;
std::size_t div_r, div_l;
while(str.find('/') != string::npos) {
    div_a = str.find('/');
    if (str.find('/', div_a + 1) != string::npos) {
        div_r = str.find('/', div_a + 1);
    }
    else {
        div_r = str.length();
    }
    if (str.rfind('/', div_a - 1) != string::npos) {
        div_l = str.rfind('/', div_a - 1);
    }
    else {
        div_l = 0;
    }
    string bi_l = str.substr(div_l, (div_a - div_l));
    string bi_r = str.substr(div_a+1, (div_r - div_a+1));
    int in_l = stoi(bi_l);
    int in_r = stoi(bi_r);
    int res_i = in_l / in_r;
    string res_s = std::to_string(res_i);
    str.replace(div_l, div_r, res_s);
    }
}

编辑包括:

1.在第20,22,28行添加了对字符串:: nops的检查。

2.更改字符串的长度以替换为第40行中的div_l而不是res_s.length()

现在,

输入= 24/2/2

输出= 6