【问题标题】:Getting a character from a 2d char array pointer that's a property on a struct pointer in C从 2d char 数组指针中获取一个字符,该指针是 C 中结构指针的属性
【发布时间】:2019-04-06 23:32:49
【问题描述】:

好的,所以这个有点奇怪,也许有更好的方法来解决这个问题,但这就是我所在的地方。

我正在为我的 CS 课程介绍用 C 语言编写战舰游戏。我目前有一个看起来像这样的结构:

typedef struct player {
    char *board[10][10];
    char *map[10][10];
    char *name;
    int kills;
    int deadShips;
    int scorePoints;
    int kdr;
    int hits;
    int misses;

}Player;

和2个功能:

void printBoard(char board[10][10]) {
    char rowLetters[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};


    printf("    1  2  3  4  5  6  7  8  9  10  \n");

    // Rows
    for (int r = 0; r < NUMROWS; ++r) {
        printf(" %c ", rowLetters[r]);

        // Columns
        for (int c = 0; c < NUMCOLS; ++c) {
            printf(" %c ", board[r][c]);
        }

        printf("\n");
    }
}

void printChar(Player *p) {

    printBoard(*(p->board));

    printf("Choice: '%c'\n", *(p->board)[3][4]);

}

printBoard 获取一个数组并将其打印出来。 printChar 是我的功能失败的部分。现在,我只想访问棋盘的一个字符。在我可以开始工作后,我可以开始检查该位置是否有船只,并相应地调整分数、船只健康状况等。

我假设因为 p 是一个指向结构的指针,并且该结构上有一个指向数组的指针,所以我可以使用 (*(*p-&gt;board))[row][col] 达到我想要的角色。特别是因为将*(p-&gt;board) 传递到printBoard 工作得很好。但是获得一个特定的索引是行不通的。所以基本上,我需要找到一只在上面的青蛙,一个凹凸,那是在一根圆木上。有没有语法可以帮助我解决这个问题?甚至是构建我的程序的更好方法?我对指针有点陌生,如果有更好的方法,我完全愿意接受。

【问题讨论】:

  • 在编写这样的 C 代码时,您需要考虑使用 2D 数组仿真而不是文字 2D 数组。您还希望避免通过值传递像char board[10][10] 这样的大型结构,而是将它们封装在某种board 结构中,您可以改为通过指针传递。最重要的是,您要避免在整个代码中散布像 10 这样的“幻数”,而是明确定义、有意义的常量,如 BOARD_HEIGHTBOARD_WIDTH,可以更改一次,并且干净地流过整个代码-基地。
  • 谢谢!将这些幻数更改为常量在我的待办事项清单上。现在,当您说 2D 仿真与文字 2D 数组时,您的意思是表示 2D 数组比嵌套数组有更好的结构吗?

标签: c arrays pointers struct char


【解决方案1】:

你对char *board[10][10]; 的声明让我有些困惑,也许这就是你的问题。

该语句声明了一个 10x10 的指向 char 的指针数组,通常被认为是一个 10x10 的字符串指针数组。您需要为这 100 个指针中的每一个的目标分配内存,我看不到您这样做。

也许您想要的是char [10][10],它是一个由 10x10 单字符实例组成的固定数组。在我看来,这似乎就是你使用它的方式。

@tadman 建议使用声明的 2D 数组的限制是您不能使代码动态 - 您不能更改内部维度,除非使用较小的数字,并忽略较高的索引。

如果您声明一个单维数组,或者使用 malloc 分配它,并编写自己的代码cell=row*width+height,那么您将拥有更大的灵活性。

不过说实话,使用 C++ 而不是 C 编写这些增强功能更容易,也许这就是你想要剪裁和限制设计的地方。

【讨论】:

    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 2021-01-26
    • 2011-04-24
    • 2021-07-14
    • 2021-11-26
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多