【问题标题】:User input in 2D array (C++)二维数组中的用户输入 (C++)
【发布时间】:2018-04-25 17:50:36
【问题描述】:

不知道为什么当我打印检查时 for 循环不会在二维数组中保存正确的值。有什么想法吗?

#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;
}

【问题讨论】:

标签: c++ for-loop user-input nested-loops


【解决方案1】:
#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;
}

【讨论】:

  • 您需要动态分配,因为您在编译时不知道行和列。
【解决方案2】:

这并不像你认为的那样。 首先,rowcol 在程序启动时初始化为零。然后你有int val[row][col];,它不是有效的 C++,而是一个 C 可变长度数组。由于此时rowcol 都为0,因此该数组的长度为零。

然后在您的循环中读取一堆值,覆盖堆栈上的内容并导致未定义的行为。

您应该改用动态分配的东西,例如std::vector 或您选择的数学库中的适当矩阵类。通常不建议手动使用动态分配(阿里建议的new int[row * col]),因为这样很容易导致内存泄漏,尤其是在涉及异常的情况下。

【讨论】:

    【解决方案3】:

    如果 C++ 支持可变长度数组,您可以通过移位来编写您想要的内容:

    int val[row][col];
    

    到已知行和列的地步。 检查这篇文章: Why aren't variable-length arrays part of the C++ standard? 否则,您的代码具有未定义的行为。您应该使用动态分配。

    【讨论】:

      【解决方案4】:

      首先,你不能拥有

      int val[row][col];
      

      在 row 和 col 具有已知值之前。其次,这种 2D 数组初始化只是 C 语言的标准。

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

      实现您想要的正确 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++ 课程,但本书使用 C / C++ 。我们没有使用其他复杂的方法来解决问题。
      • 使用向量并不是一种复杂的方式,它只是正确的方式。 C / C++ 不是一回事,因为语言在实践中完全不同,尽管表面上是密切相关的。如果您由于类本身的限制而必须使用普通数组,请参阅this question。但是,请记住,尽管工作得很好,但这种方法在 C++ 中基本上总是错误的,除非你真的知道自己在做什么并且有充分的理由这样做。
      • 我不知道为什么课程还没有包含这些内容。但是在我的原始代码中,我移动了“int val [row][col];”在 for 循环之前,它现在可以工作了。它可能不是有效的 C++,但教授正在使用它,哈哈。
      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 2021-12-07
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多