Ошибка 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 
→ Ссылка