用户输入2D数组(C )

User input in 2D array (C++)

本文关键字:数组 输入 2D 用户      更新时间:2023-10-16

当我打印以检查时,为什么for循环不会在2D数组中保存正确的值。有什么想法吗?

#include <iostream>
using namespace std;
int row, col; 
int main()
{
int num;
int val[row][col];
cout << "How many rows are there?" << endl;    
cin >> row;
cout << "How many columns are there?" << endl;
cin >> col;
cout << "Enter values for the matrix: " << endl;
for (int i = 0; i < row; i++)                 
{
    for (int j = 0; j < col; j++)
    {
        cin >> val[i][j]; 
    }   
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
    int row, col; 
    cout << "How many rows are there?" << endl;    
    cin >> row;
    cout << "How many columns are there?" << endl;
    cin >> col;
    cout << "Enter values for the matrix: " << endl;
    // check if row and col > 0
    int* val = new int[row * col];
    for (int i = 0; i < row; i++)                 
    {
        for (int j = 0; j < col; j++)
        {
            cin >> val[i * col + j]; 
        }   
    }
    delete[] val;
    return 0;
}

这不做您认为的事情。首先,在程序启动时,rowcol在零下进行了零置化。然后,您有int val[row][col];,它不是有效的C ,而是C变量长度数组。由于此时rowcol都是0,因此此数组的长度为零。

在循环中,您会读取一堆值,覆盖堆栈上的内容并导致不确定的行为。

您应该使用动态分配的东西,例如std::vector或您选择的数学库中的适当矩阵类。通常不建议使用动态分配(ALI建议的new int[row * col](,因为以这种方式获得内存泄漏非常容易,尤其是在涉及异常的情况下。

如果将在C 中支持可变长度阵列,则可以通过移动来编写想要的内容:

int val[row][col];

到已知行和col的点。检查此帖子:为什么变量长度阵列不是C 标准的一部分? 否则,您的代码具有不确定的行为。您应该使用动态分配。

首先,你不能有

int val[row][col];

行和col之前具有已知值。其次,这种2D阵列初始化仅是c。

中的标准配置。

您需要使用C 运算符new [](类似于C中的Malloc函数(手动分配堆上的数组。但是,这不是惯用的C ,而语言的全部要点是避免这样做,这就是为什么我不会解释如何做。

完成您想要的工作的适当方法是使用std :: vector,围绕C样式数组的功能非常强大的包装器自动分配并为您分配内存(以及许多其他东西(。<<<<<<<<<<<<<<<<<<<<

这是做到这一点的最简单方法:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int row;
    cout << "How many rows are there?" << endl;
    cin >> row;
    int col;
    cout << "How many columns are there?" << endl;
    cin >> col;
    int num;
    cout << "Enter values for the matrix: " << endl;
    cin >> num;
    vector<vector<int>> values(col); //initialize outer vector with col inner vectors
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            values[i].push_back(num);
        }
    }
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout << values[i][j];
        }
        cout << endl;
    }
    return 0;
}

另外,我建议您以更多的含义命名您的变量,并且您避免使用名称空间std。

编辑:从您接近程序的方式来看,我认为您对C熟悉C./p>