编译和运行我的代码时,我不断收到分割错误

时间:2021-04-04 01:28:23

标签: c

我知道这意味着尝试访问受限内存时出现问题,但我不知道如何找到错误发生的位置或如何修复它。一个小小的解释会很有帮助。

int main(int argc, char* argv[1]) {
  char emptyBoard[3][3];
  char player;
  int row, column;  // moves
  int i, j;
  // int x = 0;

  for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {
      emptyBoard[i][j] = '.';
    }
  }
  /*
    for(i = 0; i < 3; i++){
        for (j = 0; j < 3; j++){
   printf("%c ", emptyBoard[i][j]);
    }
    printf("\n");
    }
  */

  FILE* filePtr = fopen(argv[1], "r");
  if (filePtr == NULL) {
    printf("Cannot open File \n");
    return 1;
  }

  while (fscanf(filePtr, "%c, %d, %d", &player, &row, &column) != EOF) {
    // moves = x++;

    emptyBoard[row][column] = player;

    printBoard(emptyBoard);
  }

  // printf("Total Moves: %d", moves );
  fclose(filePtr);
}

void printBoard() {
  int i, j;
  char array[3][3];
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {
      printf("%c ", array[i][j]);
    }
    printf("\n");
  }
}

2 个答案:

答案 0 :(得分:0)

  1. 如果输入文件中的行或列 >= 3,程序会崩溃。

  2. fscanf 条件不足以终止循环,要么检查已处理的记录数,要么添加空间,因此 scanf 吃掉尾随的换行符:

    while (fscanf(filePtr, "%c, %d, %d ", &player, &row, &column)) != EOF) {
  1. 您调用 printBoard(emptyBoard) 但它被定义为不接受任何参数,并且您创建了一个本地 array。试试这个:
void printBoard(size_t row, size_t column, char array[row][column]) {
    int i, j;
    for (i = 0; i < row; i++) {
        for (j = 0; j < column; j++) {
            printf("%c ", array[i][j]);
        }
        printf("\n");
    }
}

...
   printBoard(3, 3, emptyBoard);
  1. 这将导致玩家被累积。如果您希望每个棋盘有一个玩家,那么您需要初始化棋盘或在空棋盘的副本上进行操作:
char board[3][3];
memcpy(board, emptyBoard, sizeof(emptyBoard);
board[row][column] = player;
printBoard(3, 3, board);

答案 1 :(得分:0)

我知道这不是您要的,但我注意到您在 printBoard(emptyBoard) 中将一个变量传递给 printBoard,但该函数实际上不接受任何参数。这里将打印的是一个“随机”的值集合。

至于您问的是什么,您是否将任何参数传递给您的可执行文件?例如,如果它的标题是“运行”,您是输入 ./run file.txt 还是只输入 ./run?如果您正在执行后者,则会导致分段错误,因为您正在尝试加载未分配给 argv 的值。 Allan 也是正确的,如果您正在加载的文件调用高于 3 的行或列,则会发生分段错误,因为您试图访问未分配给 emptyBoard 的内存。

至于查找运行时错误的原因,我发现在程序的不同步骤中放置打印语句非常有帮助。您可以学习使用调试器。

相关问题