【问题标题】:C++ Program in vscode is only displaying last two elements of a 2D arrayvscode中的C ++程序仅显示二维数组的最后两个元素
【发布时间】:2020-11-24 08:33:05
【问题描述】:
    #include <iostream>
    using namespace std;
    int main()
    {
         system("cls");
         int m,n;
         int ar[m][n];
         cout<<"Enter the rows: "<<endl;
         cin>>m;
         cout<<"Enter the columns: "<<endl;
    cin>>n;
    cout<<m<<"x"<<n<<" Matrix"<<endl;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            cin>>ar[i][j];
        }
        cout<<endl;
    }
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            cout<<ar[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

输出:

输入行:

2

输入列:

2

2x2 矩阵

1 2

3 4

矩阵:

3 4

3 4

它只显示第二行两次。 我再次输入了 2-3 次程序,但没有变化 如何克服这个错误?

请帮帮我?

【问题讨论】:

  • int ar[m][n]; 不是标准 C++,而是编译器扩展。最好使用std::vector
  • 这里 int ar[m][n];mn 的值仍然未知
  • 嗨,就像上面的 cmets 所说,我们必须在编译源代码之前确定数组的大小。要么使用最大大小声明 ar(例如 int ar[100][100];),要么使用 std::vector,这将在运行时动态定位内存。
  • 打开警告并认真对待。你的编译器可以帮助你很多,如果你让它

标签: c++ matrix


【解决方案1】:

正如 cmets 中已经提到的,问题在于 int ar[m][n]; 行。即使您的编译器允许您这样做,mn 在那时还没有被初始化。您可以查看How do you dynamically allocate a matrix?,了解如何动态分配这样的矩阵。基本上,如果我们忽略一些漂亮的优化,你有两个简单的选择:

  1. 分配双指针的旧的预标准化 C++ 方法(类似于 C):

    [...]
    
    int** ar = nullptr;  // Replacing your int ar[m][n];
    
    [...]
    cout<<m<<"x"<<n<<" Matrix"<<endl;
    
    ar = new int*[m];
    for (int i = 0; i < m; ++i)
        ar[i] = new int[n];
    
    [...]
    

    当你用完 ar 后,你必须删除内存:

    for (int i = 0; i < m; ++i)
        delete[] ar[i];
    delete[] ar;
    
  2. 为了避免手动处理内存,可以使用两个嵌套的std::vectors,如下:

     [...]
    
     vector<vector<int>> ar; // Replacing your int ar[m][n];
    
     [...]
     cout<<m<<"x"<<n<<" Matrix"<<endl;
    
     ar.resize(m);
     for (auto& row : ar)
         row.resize(n, 0); // Initialising each row with n zeros
    
     [...]
    

然后你做 cin 的。使用此代码,您不必释放内存,因为 std::vector 类会在其析构函数中为您执行此操作。

【讨论】:

  • 在 C++ 中使用动态数组的“传统”方式一直是std::vector。 “C/C++”是用词不当,没有这样的语言,C 成语不同于 C++ 成语。使用 C 和 C++ 中可以使用的习语既不是惯用的 C 也不是惯用的 C++
  • @idclev463035818,不是在标准库出现之前。当 Bjarne Stroustrup 在 1985 年编写 C++ 编程语言时,std::vector 这样的类并不存在。它们是由 Alexander Stepanov 的标准模板库在 90 年代中期引入的。在 C++98 之前,C++ 中用于动态内存的常用习语与 C 中的相似(用新闻代替 malloc,用删除代替释放)。
  • 好的,在它标准化之前我不会称它为“通用习语”。带类的 C 语言与标准化的 C++ 完全不同。没关系,我现在明白你为什么像以前那样写它了,除此之外的任何东西都只是分裂头发和意见。
  • 我想我们所说的“传统”是什么意思取决于我们的年龄。当我快 50 岁生日时,我记得每个 C++ 库都有自己的“CString”和“CList”类的时候。无论如何,我已经编辑了我的帖子以使用“旧/预标准化”而不是“传统”。
【解决方案2】:

在得到 'm' 和 'n' 的值后移动矩阵的声明。请注意,这将在堆栈上创建矩阵,因此对于大型矩阵,这不是一个好主意。您可以按照其他帖子中的建议动态分配内存。

    int main()
   {
    system("cls");
    int m, n;
    
    cout << "Enter the rows: " << endl;
    cin >> m;
    cout << "Enter the columns: " << endl;
    cin >> n;

    int ar[m][n]; // move this here ... 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2014-11-01
    • 2012-01-27
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    相关资源
    最近更新 更多