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++;
}
... 在第一次通过包含循环时,其中
i
、k
和l
最初均为零。进一步假设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/