未正确读取 2D 数组元素

2D array elements not being read properly

本文关键字:2D 数组元素 读取      更新时间:2023-10-16

输出是整行/整列的数字字符串,而不是单个数字。有人可以帮我吗?

int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */  
int t;
cin>>t;
while(t--){
    int n,m,cnt=0;
    cin>>n>>m;
    for(int i=0;i<=n+1;i++){
        for(int j=0;j<=m+1;j++){
            if(i==0||i==n+1||j==m+1||j==0) G[i][j]=0;
            cin>>G[i][j];
        }
    }
 cout<<G[1][2]<<endl;//this gives wrong o/p

返回 0;}

很可能由于i <= n + 1for循环中的j <= m + 1条件而超出范围读取,从而调用未定义的行为,从而导致堆栈损坏,从而解释您所看到的输出。将边界修改为: i < nj < m .数组在 C++ 中索引为零。第一个数组元素通过 somearray[0] 访问,最后一个元素somearray[n-1]不是somearray[n]这是您尝试在代码中访问的内容。多维数组也是如此。声明:

cout << G[i][j] << endl; 

错误地放置在for环之外。它应该在内部for回路内。数组应定义为while循环中的第二条语句:

int G[n][m]; // Avoid VLAs

话虽如此,可变长度数组不是C++标准的一部分,您应该更喜欢std::vectorstd::array而不是原始数组。

假设G是一个大小为 n x m 的 2D 数组,那么你在这里越界了:

for(int i=0;i<=n+1;i++) {
    for(int j=0;j<=m+1;j++)

因为数组索引从 0 开始,以大小 - 1 结束。

因此,代码会调用未定义的行为。为避免这种情况,只需将双精度 for 循环更改为:

for(int i = 0; i < n; i++) {
    for(int j = 0;j < m; j++)