簡體   English   中英

如何使用memset設置填充數組

[英]How to set fill out an array using memset

我有一個包含GameBoard的Player結構,它是2d字符數組。

當我使用memset時,它不會設置數組

我嘗試使用板的地址(&,*),並且沒有這些符號

如果在'initializeBoard'中使用指向Player變量的指針,我可以使它工作,但是賦值操作說不要使用指針

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

const int ROWS = 10;
const int COLS = 10;

const char *PLAYERONE = "Player 1";
const char *PLAYERTWO = "Player 2";
const char WATER = '~';
const int NUM_SHIPS = 5;

typedef struct gameBoard {
    char board[ROWS][COLS];
} GameBoard;

typedef struct human {
    char name[20];
    GameBoard gameBoard;
} Player;

// function prototypes

void displayGameBoard(Player player);
void initializeBoard(Player player);
void initializePlayer(Player *player, const char *name);






// main function
int main() {
    Player playerOne;
    Player playerTwo;
    // call function welcomeScreen

    initializePlayer(&playerOne, PLAYERONE);
    // end program
    return 0;
}

void displayGameBoard(Player player) {
    int row;
    int col;
    printf("%s's Game Board\n", player.name);
    printf("---------------------------------------------\n");
    printf("|   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |\n");
    printf("---------------------------------------------\n");
    for (row = 0; row < ROWS; row++) {
        printf("| %d |", row);
        for (col = 0; col < COLS; col++) {
            printf(" %c |", player.gameBoard.board[row][col]);
        }
        printf("\n");
    }
    printf("---------------------------------------------");
}

void initializeBoard(Player player) {
    memset(*player.gameBoard.board, WATER, sizeof(player.gameBoard.board));
}

void initializePlayer(Player *player, const char *name) {
    char playerName[20];
    GameBoard playerBoard;
    strcpy(player->name, playerName);
    player->gameBoard = playerBoard;
    initializeBoard(*player);
    displayGameBoard(*player);
}

我希望結果用'〜'填充,但是它會破壞整個終端或打印空白

問題是,您在此處按值傳遞了播放器結構:

initializeBoard(*player);

因此,您基本上是在制作副本 傳遞一個指針並像這樣處理原始結構:

initializeBoard(player);

並將initializeBoard函數更改為:

void initializeBoard(Player *player) {
   memset(player->gameBoard.board, WATER, sizeof(player->gameBoard.board)); 
}

那么它應該會按預期工作。 您也應該更改displayBoard()函數,因為沒有理由按值傳遞,而且計算量更大(復制整個結構)

這里:

void initializeBoard(Player player) {
    memset(*player.gameBoard.board, WATER, sizeof(player.gameBoard.board));
}

您通過副本而不是引用傳遞Player對象。 您要設置的對象不是您要設置的對象,並且無論如何都是臨時的。 在堆棧上傳遞大型結構也效率不高(在這種情況下,您可能還需要重新考慮displayGameBoard()的簽名)。 此外,成員board也不需要取消引用。

void initializeBoard(Player* player);

...

void initializeBoard(Player* player) 
{
    memset( player->gameBoard.board, WATER, sizeof(player->gameBoard.board));
}

然后在initializePlayer()調用它,這樣:

initializeBoard(player);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM