Ошибка Run-Time Check Failure #2 - Stack around the variable 'arr' was corrupted
Есть задание Сжать одномерный массив, состоящий из n вещественных элементов, удалив из него все элементы, модуль которых находится в интервале [a; b]. Освободившиеся в конце массива элементы заполнить нулями.
Остановился на том чтобы переносить элементы в конец строки, но не могу понять почему выходит ошибка Код:
#include <iostream>
#include <ctime>
#include <string>
using namespace std;
int main() {
setlocale(LC_ALL, ".1251");
int arr[10], n, i, j = 0, t = 0, m, a, b, tem = 0;
srand(time(0));
cout << "введите размерность массива: ";
cin >> n;
cout << endl;
for (i = 0; i < n; i++) {
arr[i] = rand() % 20;
cout << arr[i] << " ";
}
cout << "\nвведите интервал который необходимо удалить: ";
cin >> a >> b;
for (i = a; i <= b; i++) {
arr[i] = 0;
}
for (i = a; i < n; i++) {
if (i++ < n) {
tem = arr[i];
arr[i] = arr[i++];
arr[i++] = tem;
}
}
for (i = 0; i < n; i++) {
cout << arr[i] << " ";
}
}
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
Ошибки в представленном коде:
- Сначала создаётся массив из 10 элементов, а затем он начинает заполняться для произвольного значения
n, то есть, происходит выход за пределы массива дляn > 10. - На принадлежность диапазону проверяются НЕ числа, как сказано в условии, а индексы в массиве, для этого используется излишний проход по массиву.
После исправления указанных ошибок, для решения задачи достаточно скопировать все подходящие элементы в начало массива, а затем дописать нули в конец.
Вариант решения (онлайн демо):
#include <iostream>
#include <ctime>
#include <string>
#include <cstdlib>
using namespace std;
int main() {
setlocale(LC_ALL, ".1251");
srand(time(0));
int n;
cout << "Введите размерность массива: ";
cin >> n;
cout << endl;
int arr[n];
for (int i = 0; i < n; i++) {
arr[i] = rand() % 20;
cout << arr[i] << " ";
}
int a, b;
cout << endl << "Введите интервал который необходимо удалить: ";
cin >> a >> b;
int j = 0;
for (int i = 0; i < n; i++) {
int x = abs(arr[i]);
if (x < a || x > b) {
arr[j++] = arr[i];
}
}
while (j < n) arr[j++] = 0;
cout << endl << "Сжатый массив" << endl;
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
}
Пример:
Введите размерность массива: 15
17 13 12 4 1 14 6 4 14 15 9 4 19 11 12
Введите интервал который необходимо удалить: 3 13
Сжатый массив
17 1 14 14 15 19 0 0 0 0 0 0 0 0 0