Ошибка в коде С++ Run-Time Check Failure #2 - Stack around the variable 'arr' was corrupted

106
12 января 2021, 19:50
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    const int n = 3;
    int arr[n][n];
    int i = 0;
    while (i < n)
    {
        i++;
        int j = 0;
        while (j < n)
        {
            j++;
            cout << "arr[" << i << "][" << j << "]=";
            cin >> arr[i][j];
        }
    }
    cout << "\nYour matrix:\n";
    while (i < n)
    {
        i++;
        int j = 0;
        while (j < n)
        {
            j++;
            cout << setw(3) << arr[i][j];
        }
        cout << endl;
    }
    cout << "\nNew matrix: \n";
    while (i < n)
    {
        i++;
        int j = 0;
        while (j < n)
        {
            j++;
            if (arr[i][j] < 0)
            {
                arr[i][j] = 0;
            }
            else
            {
                arr[i][j] = 1;
            }
            cout << setw(3) << arr[i][j];
        }
        cout << endl;
    }
    system("pause");
    return 0;
}
Answer 1

Очевидная проблема - проверки на выход за пределы массивов происходит до инкремента индекса элемента массива, а не после:

constexpr ::std::size_t const rows_count{3};
constexpr ::std::size_t const cols_count{rows_count};
int arr[rows_count][cols_count]{};
for(::std::size_t row_index{}; row_index < rows_count; ++row_index)
{
    for(::std::size_t col_index{}; col_index < cols_count; ++col_index)
    {
        ::std::cout << "arr[" << row_index << "][" << col_index << "]=";
        ::std::cin >> arr[row_index][col_index];
    }
}
Answer 2

Я просто исправил ваши ошибки:

constexpr unsigned  n = 3;  
int arr[n][n];
unsigned i = 0, j = 0;
while ( i < n)
{           
    while (j < n)
    {           
        cout << "arr[" << i << "][" << j << "]=";
        cin >> arr[i][j];
        ++j;
    }
    ++i;
    j = 0;
}
cout << "\nYour matrix:\n";
i = 0;
j = 0;
while (i < n)
{           
    while (j < n)
    {           
        cout << setw(3) << arr[i][j];
        ++j;
    }
    cout << endl;
    ++i;
    j = 0;
}
cout << "\nNew matrix: \n";
i = 0;
j = 0;
while (i < n)
{           
    while (j < n)
    {           
        if (arr[i][j] < 0)
        {
            arr[i][j] = 0;
        }
        else
        {
            arr[i][j] = 1;
        }
        cout << setw(3) << arr[i][j];
        ++j;
    }
    cout << endl;
    ++i;
    j = 0;
}

каждый раз вы доолжны обходить массив с первого элемента, а для этого каждый раз индексы должны быть нулевыми...

READ ALSO
Почему не работает implicit conversion

Почему не работает implicit conversion

почему код с template<class T> компилируется, а без него нет

101
Указать ID в JQuery

Указать ID в JQuery

Есть счётчик и JS-код, в строке 71 decimals: 0 будет заменяться на 1 или 2Где и как указать ID (например, #%id%), чтобы при нескольких счётчиках на странице,...

89
Как скрыть элементы у родителей с jquery?

Как скрыть элементы у родителей с jquery?

не пойму как скрыть "del" только у тех элементов у которых есть дочерние https://jsfiddlenet/KLON/2z7xpqrt/10/

121
Не добавляется 0 в jquery.mask

Не добавляется 0 в jquery.mask

Хочу сделать маску ( https://githubcom/igorescobar/jQuery-Mask-Plugin ) для номера телефона, чтобы всегда в поле было +70 а дальше уже пользователь мог ввести любые...

105