Когда вы используете Microsoft Visual Studio для отладки программ, скомпилированных в режиме отладки, в ваш код добавляется множество проверок, чтобы предотвратить появление неопределенного или неправильно установленного кода в вашей программе. «Debug Assertion Failed» - это общее сообщение, которое вы получаете, когда обнаружена одна из этих распространенных ошибок, для которых Debug Runtime Library явно тестирует.
Фактическое сообщение, о котором вам нужно позаботиться, приводится в нескольких строках ошибки:
Expression: string subscript out of range
Сообщаем вам, что вы пытаетесь получить доступ за пределами своих строк.
Мое лучшее предположение, что подозрительная строка - это часть кода:
if (last.size() == 1)
{
res[1] = last[0]; string res2;
for (int i = 1; i < res.size(); i++)
{
res2[i - 1] = res[i];
}
return res2;
}
res2
объявляется, но его размер никогда не выделяется или не изменяется. Ваш код просто предполагает, что строка имеет емкость и пытается присвоить ей символы. Это неопределенное поведение, но поскольку ваш компилятор пытается вам помочь, он вместо этого объявляет это как определенное поведение, которое вызывает исключение, и исключение не перехватывается.
Похоже, res2
должен иметь размер, равный размеру res
минус 1, поэтому я советую просто вручную изменить размер res2
в этом коде:
if (last.size() == 1)
{
res[1] = last[0]; string res2;
res2.resize(res.size() - 1);
for (int i = 1; i < res.size(); i++)
{
res2[i - 1] = res[i];
}
return res2;
}
Это должно исправить этот конкретный случай плохого поведения.
Я также предлагаю вам проверить оставшуюся часть кода на наличие ошибок, подобных этой.
Еще одна вещь. Кажется, вы пишете свою собственную целочисленную арифметику произвольной точности. Если это часть школьного задания (или просто то, чему вы пытаетесь научить себя), продолжайте работать над ним, следуя совету, который я дал здесь.
Если, однако, это предназначено для хобби или профессионального проекта, я советую вам вместо этого использовать хорошо зарекомендовавшую себя библиотеку арифметики с произвольной точностью, вместо того, чтобы пытаться изобретать велосипед. Я рекомендую использовать boost.multiprecision
или GMP, в зависимости от ваших потребностей разработчика.