The orange crosses are made from 'G' of the matrix and are valid. Blue ones are made from 'B' and are invalid
下面的代码用于寻找从2D阵列(由G’和B’组成的手的长度相等的2个最大交叉区域。十字架应该由“G”组成
下面的代码在扫描2D矩阵时/之后给出了分割错误。请帮忙!!

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
int i,j,k,l,p,q;
char M[10][10];
int m, n;
int min=0;
int rl=0;
int max1=1;
int max2=1;
int area;
int tarea;
int cu=0;
scanf("%d",&n);
scanf("%d",&m);
//matrix scan
for(i=0;i<n;i++){
  for(j=0;j<m;j++){
    scanf("%c",&M[i][j]);

  }
}
 // finding first cross

for(i=0;i<n;i++){
   for(j=0;j<n;j++){
     k=j;
     l=k;
    p=i;
    q=i;
    while(M[i][k]!='B' || M[i][l]!='B' || l!=m || k!=0){
        k--;
        l++;
        rl++;
    }

    while(M[p][j]!='B' || M[q][j]!='B' || p!=0 || q!=n){
        p--;
        q++;
        cu++;
    }
    if(rl>cu){
    min=cu;
    }
    else
    min=rl;
    area=min*4+1;
    if(area>max2){
    max2=area;
    }
    if(area>max1){
    max1=area;
    }

    }
  }

tarea=max1+max2;
printf("%d",tarea);

return 0;
}

最佳答案

您的两个while循环可以非常容易地生成对arrayM的越界访问。例如,考虑一下。。。

while(M[i][k]!='B' || M[i][l]!='B' || l!=m || k!=0){
    k--;
    l++;
    rl++;
}

... 在第一次通过包含循环时,其中ikl最初均为零。进一步假设M[0][0]的值与'B'不同。然后将执行循环体,导致k获取值-1,然后再次计算控制表达式,从而尝试读取M[0][-1]的值。结果是不确定的,但分割错误——当时或之后——是完全合理的。
您需要首先进行边界测试,并且需要使用&&而不是||以确保在到达边界时实际上退出了循环。我现在还不清楚你到底想做些什么,但总的来说:
while((k > 0) && (l < m) && (M[i][k] != 'B' || M[i][l] != 'B')) {
    k--;
    l++;
    rl++;
}

类似的情况也适用于您的其他while循环。
这些不是唯一的问题,但他们可能是你问的行为的责任人。

关于c - C中二维数组的分割错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35093845/

10-10 01:12