当我在Windows上运行代码时(CodeBlocks),一切正常,但当我在Linux上运行时,它说***检测到堆栈崩溃***,除了板外不打印任何东西;下面是代码:
#include <stdio.h>
#include <stdlib.h>
void inimatri(char mat[7][7]){
int l=0,c=0;
while (l<8){
while (c<8){
mat[l][c]='.';
c=c+1;
}
c=0;
l=l+1;
}
mat[3][3]='O';
mat[3][4]='X';
mat[4][3]='X';
mat[4][4]='O';
mat[2][5]='O';
mat[5][2]='O';
mat[3][2]='O';
mat[5][4]='O';
}
void showmat (char mat[7][7]){
int l=0,c=0;
printf(" 0 1 2 3 4 5 6 7");
while (l<8){
printf( "\n%d",l);
while (c<8){
printf( " %c",mat[l][c]);
c=c+1;
}
c=0;
l=l+1;
}
}
int hord(char mat[7][7], int l, int c, char pecaac){
int legal;
if (c== 7){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l][c+1]==pecaac){
return 0;
}
while ((c+1)<8){
if (mat[l][c+1]=='.'){
return 0;
}
else if (mat[l][c+1]== pecaac){
return 1;
}
else{
legal= 0;
}
c=c+1;
}
return(legal);
}
int hore(char mat[7][7], int l, int c, char pecaac){
int legal=0;
if (c== 0){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l][c-1]==pecaac){
return 0;
}
while (0<=(c-1)){
if (mat[l][c-1]=='.'){
return 0;
}
else if (mat[l][c-1]== pecaac){
return 1;
}
else {
legal=0;
}
c=c-1;
}
return (legal);
}
int verb(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 7){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l+1][c]==pecaac){
return 0;
}
while ((l+1)<8){
if (mat[l+1][c]=='.'){
return 0;
}
else if (mat[l+1][c]== pecaac){
return 1;
}
else{
legal=0;
}
l=l+1;
}
return (legal);
}
int verc(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 0){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l-1][c]==pecaac){
return 0;
}
while (0<=(l-1)){
if (mat[l-1][c]=='.'){
return 0;
}
else if (mat[l-1][c]== pecaac){
return 1;
}
else{
legal = 0;
}
l=l-1;
}
return (legal);
}
int diads(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 0 || c== 7){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l-1][c+1]==pecaac){
return 0;
}
while (0<=(l-1) && c+1<8){
if (mat[l-1][c+1]=='.'){
return 0;
}
else if (mat[l-1][c+1]== pecaac){
return 1;
}
else{
legal = 0;
}
l=l-1;
c=c+1;
}
return (legal);
}
int diadi(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 7 || c== 7){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l+1][c+1]==pecaac){
return 0;
}
while ((l+1)<8 && (c+1)<8){
if (mat[l+1][c+1]=='.'){
return 0;
}
else if (mat[l+1][c+1]== pecaac){
return 1;
}
else{
legal = 0;
}
l=l+1;
c=c+1;
}
return (legal);
}
int diaes(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 0 || c== 0){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l-1][c-1]==pecaac){
return 0;
}
while (0<=(l-1) && 0<=(c-1)){
if (mat[l-1][c-1]=='.'){
return 0;
}
else if (mat[l-1][c-1]== pecaac){
return 1;
}
else{
legal = 0;
}
l=l-1;
c=c-1;
}
return (legal);
}
int diaei(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 7 || c== 0){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l+1][c-1]==pecaac){
return 0;
}
while ((l+1)<8 && 0<=(c-1)){
if (mat[l+1][c-1]=='.'){
return 0;
}
else if (mat[l+1][c-1]== pecaac){
return 1;
}
else{
legal = 0;
}
l=l+1;
c=c-1;
}
return (legal);
}
int clegal(char mat[7][7], int l, int c, char pecaac){
int ld,le,lc,lb;
int ldi, lds,lei,les;
int legal=0;
lb=verb(mat,l,c,pecaac);
lc=verc(mat,l,c,pecaac);
le=hore(mat,l,c,pecaac);
ld=hord(mat,l,c,pecaac);
ldi=diadi(mat,l,c,pecaac);
lds=diads(mat,l,c,pecaac);
lei=diaei(mat,l,c,pecaac);
les=diaes(mat,l,c,pecaac);
legal = lb+lc+le+ld+ldi+lds+lei+les;
printf("\n %d",legal);
if (legal==0){
printf("Jogada ilegal");
}
else{
return 1;
}
}
int main(int argc, char *argv[])
{
char matriz[7][7];
char pecaj, pecaai;
int x,y;
pecaj='X';
pecaai='O';
inimatri(matriz);
showmat(matriz);
x=6;
y=4;
clegal(matriz,x,y,pecaj);
return 0;
}
我试着检查我是否添加了比数组可以存储的更多的数字,但我没有找到任何问题,也搜索了其他解决方案,但没有找到任何东西
1条答案
按热度按时间gt0wga4j1#
在我的Linux系统上测试你的代码时,它确实抛出了一个粉碎性错误。在审查你的代码时,有几件事似乎突出了,这似乎有助于以粉碎性错误结束。
首先,正如上面的好评论中所指出的,似乎有一些混乱,当数组元素开始于“1”或“0”时,而且似乎程序真的打算使用“8 x 8”数组而不是“7 x 7”数组。
在回顾下面的“printf”语句时,显然要使用“8 x 8”数组。
因此,考虑到这一点,我对程序进行了一些重构,设置了一个“8 x 8”数组沿着利用从“0”到“7”的范围来符合“C”程序中常见和习惯的索引下标。
要指出的一些关键项目。
有了这些,下面是我的Linux系统上终端的示例输出。
在您空闲的时候检查这个重构的代码,看看它是否符合您项目的精神。