【发布时间】:2016-05-07 17:43:37
【问题描述】:
以下代码用于从 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;
}
【问题讨论】:
-
尝试阅读的代码有点像灾难,但我看不到边界测试(您的数组是 10x10,但您从不检查
m或n以验证它们不会超过. 还要注意,在调试器中运行它会给你一个答案,就像 SO 一样快。 -
您没有给出任何输入示例。另外,使用调试器。您将 i 和 j 都循环到 n,也许这就是问题所在?
-
为了便于我们人类理解和阅读,1) 请一致地缩进代码。在每个左大括号 '{' 后缩进。在每个右大括号 '}' 之前取消缩进,即使可选大括号实际上不在代码中,也执行缩进。 2) 使用有意义的变量名。
M、p、q、rl、cu等没有意义。 3) 用一个空行分隔代码块(for、if、else、while、do...while、switch、case、default) -
当需要用户输入时(参见对
scanf()的调用),总是告诉用户他们应该输入什么。否则,用户将盯着空白屏幕,光标闪烁,不知道下一步该做什么。 -
作为有意义名称的示例:
m可以是numRows,n可以是numCols。同样,在现代C语言中,如果先输入行数和列数,然后将矩阵M声明为:char M[numRows][numCols];,那么超出矩阵边界的风险将大大降低,甚至可能消除
标签: c multidimensional-array segmentation-fault