(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.