[英]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.