c - 用 C 编写的程序无限循环或在一段时间后崩溃

标签 c loops compilation crash infinite

这是我第一次提出问题,也是我第一次编写这么大的程序。正如您可能猜到的那样,我是编程新手。

好的源代码:

#include <stdio.h>

   typedef struct{
       int **a;
       int size;
     }_board;

    typedef _board* board;

    typedef struct{
       int row,col;
    }position;


int main () {

    int i, j, turn=1, victory = 0, num=0;
    _board b;
    char P1symbol, P2symbol, mark, boardarray[b.size][b.size];
    position p;

    printf("WELCOME TO THE GAME OF TIC TAC TOE!\n");

    do {

        printf("\nwill player one, use X or O as his symbols? select by pressing x or o\n");
        scanf(" %c", &P1symbol);
        if (P1symbol == 'x' || P1symbol == 'o') {
            num = 1;
        }
     } while ( num == 0);

        if (P1symbol == 'x') {
          P2symbol = "o";
        }
         else {
          P2symbol = "x";
         }

   do {
    printf("\n now choose the size of the game board, type a numeral and press enter");
     scanf("%d", &b.size);
   }while (b.size <= 0);



   for (i=0; i=b.size; i++){
    for (j=0; j=b.size; j++){
        boardarray[i][j] = "-";
    }
   }


  do {
     do {

    boardsketch(boardarray, b.size);


      if (turn%2 ==  1) {
         printf("player 1, please choose a box to input you mark on");
         mark = P1symbol;
      }else{
         printf("player 2, please choose a box to input you mark on");
         mark = P2symbol;
      }


       printf("type the coordinates i,j, which correspond to the row and collumn number");
       printf("make sure the numbers are valid, not taken, and between 0 and %d", b.size);

       scanf("%d %d", &p.row, &p.col);
     }while (p.row > b.size && p.row < 0 && p.col > b.size && p.col <0 && boardarray[p.row][p.row] != "-");
        turn++;

      boardarray[p.row][p.col] = mark;




  } while (wincheck(boardarray, p.row, p.col, b.size) != 1);


return 0;
}

int wincheck(int row, int col,  int size, char boardarray[size][size])
{

    if (boardarray[row][col] = boardarray[row -1][col -1] = boardarray[row +1][col +1]) {
        return 1;
    }
    if (boardarray[row][col] = boardarray[row -1][col] = boardarray[row +1][col]) {
        return 1;
    }
    if (boardarray[row][col] = boardarray[row][col -1] = boardarray[row][col +1]){
        return 1;
    }
    if (boardarray[row][col] = boardarray[row -1][col +1] = boardarray[row +1][col -1]){
        return 1;
    }


}

void boardsketch(int size, char boardarray[size][size]) {
   int i, j;

    for (i=0; i=size; i++) {
        for (j=0; j=size; j++) {
            if (boardarray[i][j] == '-') {
                printf("|   ");
            } else {
                printf("%c  |", &boardarray[i][j]);
            }

        }
    }
}

现在该程序的目的是模拟井字游戏(添加用户,决定游戏板的大小)。我的问题是,尽管编译已实现,但程序在到达特定行时会执行 2 个奇怪的行为,该行是:

do {
        printf("\n now choose the size of the game board, type a numeral and press enter");
         scanf("%d", &b.size);
       }while (b.size <= 0);

如果我输入的值不符合 b.size <= 0,则上面的 printf 会无限期地重复,如果我确实输入了正确的值,则程序不会恢复。我究竟做错了什么?我又是编程新手了...对我宽容一些:D

最佳答案

您的代码中存在编译器错误。我不知道你是如何编译和构建它的。

编译器错误:

  1. 你有:

      P2symbol = "o";
    

    “o”的类型是char const*P2symbol 的类型为 char。你需要的是

      P2symbol = `o`;
    
  2. 几行之后,您将获得:

      P2symbol = "x";
    

    需要更改为:

      P2symbol = `x`;
    
  3. 几行之后,您将获得:

        boardarray[i][j] = "-";
    

    它也遇到了相同的编译器错误。您需要将其更改为:

        boardarray[i][j] = `-`;
    
  4. 您对 boardsketch 的声明和定义与您调用它的方式不匹配。您的电话是:

    boardsketch(boardarray, b.size);
    

    您将其定义为:

    void boardsketch(int size, char boardarray[size][size]) {
    ....
    }
    

    您需要更改调用或函数定义以使它们匹配。另外,您应该在使用该函数之前对其进行声明。添加

    void boardsketch(int size, char boardarray[size][size]);
    

    main开始之前。

  5. wincheck 的定义和调用也遇到同样的错误。在使用之前还应该有一个声明。

  6. 在调用 boardarray 后几行,您将看到以下行:

    }while (p.row > b.size && p.row < 0 && p.col > b.size && p.col <0 && boardarray[p.row][p.row] != "-");
    

    该语句的最后一部分存在 charchar const* 不匹配的问题。您需要将其更改为:

    }while (p.row > b.size && p.row < 0 && p.col > b.size && p.col <0 && boardarray[p.row][p.row] != '-');
    

运行时错误:

你有:

_board b;
char P1symbol, P2symbol, mark, boardarray[b.size][b.size];

问题在于b.size未初始化。它可以是任何东西。使用它来声明 Broadarray 是有问题的。想象一下,如果将 b.size 初始化为负数,将会发生什么困惑。为了实现理智且可预测的行为,您应该在使用其数据之前正确初始化 b

下面几行,您要求用户输入size

do {
  printf("\n now choose the size of the game board, type a numeral and press enter");
  scanf("%d", &b.size);
}while (b.size <= 0);

这里有一个逻辑错误。您在创建了 boardarray 后询问了板的大小。您可以做的是收集初始输入并使用它们来调用游戏核心发生的另一个函数。

/* Function that contains the core part of playing the game */
void playgame(char P1symbol, char P2symbol, int size)
{
   int i, j, turn=1, victory = 0;
   char mark, boardarray[size][size];
   position p;

   for (i=0; i=size; i++){
       for (j=0; j=size; j++){
           boardarray[i][j] = '-';
       }
   }


   do {
       do {

           boardsketch(size, boardarray);

           if (turn%2 ==  1) {
               printf("player 1, please choose a box to input you mark on");
               mark = P1symbol;
           }else{
               printf("player 2, please choose a box to input you mark on");
               mark = P2symbol;
           }


           printf("type the coordinates i,j, which correspond to the row and collumn number");
           printf("make sure the numbers are valid, not taken, and between 0 and %d", size);

           scanf("%d %d", &p.row, &p.col);
       }while (p.row > size && p.row < 0 && p.col > size && p.col <0 && boardarray[p.row][p.row] != '-');
       turn++;

       boardarray[p.row][p.col] = mark;

   } while (wincheck(p.row, p.col, size, boardarray) != 1);

}

现在,main 可以简化为:

int main () {
    char P1symbol;
    char P2symbol;
    int size;
    int num = 0;

    printf("WELCOME TO THE GAME OF TIC TAC TOE!\n");

    do {
        printf("\nwill player one, use X or O as his symbols? select by pressing x or o\n");
        scanf(" %c", &P1symbol);
        if (P1symbol == 'x' || P1symbol == 'o') {
            num = 1;
        }
    } while ( num == 0);

    if (P1symbol == 'x') {
        P2symbol = 'o';
    }
    else {
        P2symbol = 'x';
    }

    do {
        printf("\n now choose the size of the game board, type a numeral and press enter");
        scanf("%d", &size);
    }while (size <= 0);


    playgame(P1symbol, P2symbol, size);

    return 0;
}

关于c - 用 C 编写的程序无限循环或在一段时间后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23330221/

相关文章:

c - C 预处理器指令的 Lex 规则

javascript - 使循环和代码更有效地使用循环处理大量数字

c - 枚举存储在哪里?

c - 使用每个选项列表简化编译

compilation - 在 CentOS 7 上编译 Shotdetect

c - 如何在 macOS 上使用 gcc 生成包含 C 源代码的程序集?

c++ - 修复 GCC 的 #includes <> (Code::Blocks)

c - 尝试创建链接列表时出现段错误

Javascript循环遍历数组异步

javascript - 使用正则表达式仅获取一场匹配