无法正确读取2D数组元素

时间:2017-10-23 09:12:01

标签: c++ arrays loops io

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

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

2 个答案:

答案 0 :(得分:2)

由于i <= n + 1循环中的j <= m + 1for条件导致i < n因此调用undefined behavior导致堆栈损坏,导致输出解释,因此您很可能正在读取界限你看到了。将边界修改为: j < msomearray[0]。数组在C ++中为零索引。第一个数组元素是通过somearray[n-1]访问的,最后一个元素是somearray[n]而不是cout << G[i][j] << endl; ,这是您尝试在代码中访问的内容。多维数组也是如此。声明:

for

错误地放在for循环之外。它应该在内部while循环内。应该将数组定义为int G[n][m]; // Avoid VLAs 循环中的第二个语句:

std::vector

这就是说可变长度数组不是C ++标准的一部分,你应该更喜欢std::arrayorg.h2.jdbcx.JdbcDataServer到原始数组。

答案 1 :(得分:2)

假设G是一个大小为n x m的二维数组,那么你就会超出界限:

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

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

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

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