【问题标题】:how to return a 2D array from a function to the main function,and save it in another array?如何将二维数组从函数返回到主函数,并将其保存在另一个数组中?
【发布时间】:2020-04-08 21:29:24
【问题描述】:

我正在编写一个游戏“井字游戏” 我要求每个玩家在两个不同的函数中输入他们的下一步动作, 然后我将他们的动作保存在二维数组中,并将这个数组保存在主函数中的另一个二维数组中。 但是当我打印数组时,它会在第二个玩家进入下一步时更改字符符号。 PS:这是一个字符数组。 这是我的代码

char player1(char board[N][N], int n)
{
    int  k, l;
    print_player_turn(1);
    scanf("%d%d", &k, &l);
    board[k - 1][l - 1] = 'X';
    print_board(board, n);
    return board;
}
char player2(char board[N][N], int n)
{
    int  k, l;
    print_player_turn(2);
    scanf("%d%d", &k, &l);
    board[k - 1][l - 1] = 'O';
    print_board(board, n);
    return board;
}
int main()
{
    char board[N][N];
    int n;
    print_welcome();
    print_enter_board_size();
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            board[i][j] = '_';
    print_board(board, n);
    char* ptr = board;
    while (isFull(board,n)==0)
    {
        board[0][0] = player1(board, n);
        if (XloseGeneral(board, n) == 1)
        {
            print_winner(2);
            return 0;
        }
        board[0][0] = player2(board, n);
        if (OloseGeneral(board, n) == 1)
        {
            print_winner(1);
            return 0;
        }
    }
    print_tie();

} 

【问题讨论】:

  • 数组总是作为指针传递给函数。因此,您在函数内的数组中所做的任何更改都将反映在 main.js 中。这基本上意味着您不需要返回数组并且分配board[0][0] = 是完全没有必要的。除此之外,我没有看到任何明显的问题。
  • 您的编译器应该对函数player1player2 显示警告,因为您尝试返回错误的类型。 (函数应该返回char,而不是char[][]。)在C 中,数组是通过引用传递的,因此您不需要返回修改后的board。你想用board[0][0] = player1(board, n); 实现什么?目前它将数组中第一个字符的地址转换为char,并将其存储在数组中[0][0] 的位置。请edit您的问题以添加更多信息。将返回类型更改为void 并删除return 语句。

标签: c arrays


【解决方案1】:

我建议您扩展 2D 数组“板”的范围,以便包括玩家 1 和玩家 2 在内的所有方法都可以访问它,而不是将其作为参数传递。

这样您可以确保修改是在同一个变量上进行的,并且不会发生重新初始化,这会导致丢失之前的条目。

【讨论】:

  • 这应该是一条评论。它没有回答这个问题。除此之外,使用全局变量也不是一个好主意。
【解决方案2】:

数组通过引用传递给函数。这意味着,指向数组的指针被传递给函数。因此,对函数 inside 的数组所做的任何修改都将反映调用者(在您的情况下为 main 方法)。因此,将您的函数设为 void,因为它不需要返回任何内容,并从中删除 return 语句。

【讨论】:

  • 关闭。您不能将数组传递给函数。当您尝试时,它衰减为指向其第一个元素的指针。由于这种衰减发生在函数声明(char player1(char board[N][N], int n) 实际上被编译器理解为char player1(char (*board)[N], int n))和函数调用(player1(board, n) 被理解为player1(&amp;board[0], n))时,效果就像您通过引用传递了数组一样。但是您所做的只是将指针传递给数组的第一个元素。
【解决方案3】:

正如其他人所说,您不需要归还电路板,您只需将指针传递给电路板即可。这是一个基于您的代码的简短示例:

#include <stdio.h>
#include <stdlib.h>

void player1(char **board);
void player2(char **board);
void print_board(char **board, int n);

void player1(char **board){
    int  k, l;
    fprintf(stderr, "Player 1, enter grid position:\n");
    scanf("%d%d", &k, &l);
    board[k - 1][l - 1] = 'X';
}

void player2(char **board){
    int  k, l;
    fprintf(stderr, "Player 2, enter grid position:\n");
    scanf("%d%d", &k, &l);
    board[k - 1][l - 1] = 'O';
}


void print_board(char **board, int n){
    for (int i = 0; i < n; i++){
        for( int j = 0; j < n; j++ ){
           fprintf(stdout, "%c ", board[i][j]);
        }
        fprintf(stdout, "\n");
    }
}

int main()
{
    int n;
    char **board; 
    fprintf(stdout, "Type in the board size:\n");
    scanf("%d", &n);

    // allocate memory for the board
    board = (char **) malloc(n * sizeof(char*));
    for (int i = 0; i < n; i++){
        board[i] = (char *)malloc(n * sizeof(char));
        for (int j = 0; j < n; j++){
            board[i][j] = '_';
        }
    }

    print_board(board, n);

    player1(board);
    player2(board);

    print_board(board, n);

    return 0;
}

【讨论】:

  • 您不需要指针数组或双指针间接寻址。 char board[n][n] 的 OP 方法很好。如果要将数组移动到堆中,只需使用char (*board)[n] = malloc(n*sizeof(*board));。函数原型与此保持不变,因为 char (*)[n] 是数组函数参数无论如何衰减到的类型。
猜你喜欢
  • 1970-01-01
  • 2016-02-16
  • 2021-02-08
  • 2021-06-14
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多