(abort) has been called

Моё задание - раскрыть скобки вида "(mx+n)(px+q)" в виде ax^2+bx+c (преобразовать в стандартный вид квадратного уравнения). Моя тактика - вытащить все числа из скобок и "собрать" из них уравнение. Ход: убрать скобки, убрать коэффициенты x, алгоритмом (из-за которого и происходит ошибка) занести все числа в массив, затем собрать уравнение. Вот мой код:

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

int main()
{
    setlocale(LC_ALL, "Russian");

    int vals[4]; // Массив для хранения чисел, вытащенных из многочлена.
    string temp = ""; 
    char var = '\0'; // Для хранения переменной.
    
    string eq = "(-h-7)(4h+3)";

    for (int i = 0; i < eq.length(); i++)
    {
        if (eq[i] == '(') eq[i] = '\0'; //Замена открывающей скобки на пустой символ
        else if (eq[i] == ')') eq[i] = ' '; //Замена закрывающей скобки на пробел

        if (isalpha(eq[i]) && (eq[i - 1] == '-' || eq[i - 1] == '\0')) //Если перед переменной стоит знак -, то заменяем её на 1
        {
            var = eq[i]; eq[i] = '1';
        }
        else if (isalpha(eq[i]) && isdigit(eq[i - 1])) //Если перед переменной стоит число (цифра), то заменяем её (переменную) на пустое место
            eq[i] = '\0';

    } // В итоге из "(-h-7)(4h+3)" получается "-1-7 4+3 "

    cout << eq << endl;

    for (int i = 0, j = 0; i < eq.length(); i++) //Здесь я распределяю числа по массиву vals
    {
        temp += eq[i];

        if ( (eq[i + 1] == '-' || eq[i + 1] == '+' || eq[i + 1] == ' ') && (eq[i + 2] != '-') ) //Если следующий знак НЕ ЦИФРА, то преобразовываем строку в число через stoi() и запихиваем в vals[]
        {
            vals[j] = stoi(temp); //ЗДЕСЬ ОШИБКА (1)
            j++;
            temp = "";
        }

    }
    
    temp += to_string(vals[0] * vals[2]) + var + "^2";

    ( (vals[0] * vals[3] + vals[1] * vals[2]) >= 0) ? temp += '+' + to_string(vals[0] * vals[3] + vals[1] * vals[2]) + var : temp += to_string(vals[0] * vals[3] + vals[1] * vals[2]) + var;
    ((vals[1] * vals[3]) >= 0) ? temp += '+' + to_string(vals[1] * vals[3]) : temp += to_string(vals[1] * vals[3]);
    //Здесь я просто собирал уравнение.
    cout << temp << endl;
    
    system("pause>0");

}

(1):

Возникло необработанное исключение по адресу 0x76D4B502 в 
Project.exe: исключение Microsoft C++: std::invalid_argument по
адресу памяти 0x008FF244.

Причём если я на месте cout << eq << endl; объявлю string a = "-1-7 4+3 " и второй цикл for будет работать с a, то ошибки не возникнет. В чём проблема?

Если я продолжу дебаггинг, меня перебрасывает в библиотеку string на функцию stoi и пишет, что:

Run-Time Check Failure #0 - The value of ESP was not properly saved 
across a function call.  This is usually a result of calling a function 
declared with one calling convention with a function pointer declared 
with a different calling convention.

Так же был бы рад вашей критике моего кода. Лично мне почему-то не очень нравится такое большое количество if.


Ответы (0 шт):