在 stdout 上打印时弯曲的二维数组(填充空白二维数组)
Crooked 2D array when printing it on stdout (populating a blank 2D array)
我正在尝试用 D
放在随机位置的字符填充空白二维数组(矩阵)。
这是可以正常工作的代码:
#define RIGHE 10
#define COLONNE 10
void drawMap(char[][COLONNE]);
int main()
{
char mappa[RIGHE][COLONNE] = {" "}; // blank, as an empty chess board
drawMap(mappa);
return 0;
}
/* Disegna la mappa da gioco */
void drawMap(char mappa[][COLONNE])
{
int rigaDestinazione, colonnaDestinazione;
srand(time(NULL)); // Randomizza numeri
rigaDestinazione = rand() % RIGHE;
colonnaDestinazione = rand() % COLONNE;
mappa[rigaDestinazione][colonnaDestinazione] = 'D';
for (int i = 0; i < RIGHE; i++) {
for (int j = 0; j < RIGHE; j++) {
printf("[ %c ]", mappa[i][j]);
}
printf("\n");
}
}
不幸的是,当我打印它时,它似乎是不对称的,如你所见,输出是:
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ D ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
我该如何解决?
这个:
char mappa[RIGHE][COLONNE] = {" "}; // blank, as an empty chess board
只初始化数组的第一个元素,你可以使用memset来初始化它们:
memset(mappa, ' ', sizeof(mappa)); //<-- #include <string.h>
您还应注意,要使用 ' '
而不是 " "
来初始化字符,这是针对字符串的。
为了彻底,srand(time(NULL));
只需要执行一次,可以放在main()
函数调用前
这个代码
char mappa[RIGHE][COLONNE] = {" "}; // blank, as an empty chess board
用字符串 " "
初始化数组的第一个元素,即 mappa[0]
。这使得 top-left 元素包含 ' '
(space 字符),其余行填充 NUL 字符 '[=17=]'
。所有其他行都是 zero-initialized.
与下面的例子比较:
char mappa[RIGHE][COLONNE] = {"Hello","world!"};
在这种情况下,您的输出可能是(直到放置 D
):
[ H ][ e ][ l ][ l ][ o ][ ][ ][ ][ ][ ]
[ w ][ o ][ r ][ l ][ d ][ ! ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ D ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
你真正想要的是用 space 填充整个数组,像这样:
char mappa[RIGHE][COLONNE];
memset(mappa, ' ', sizeof mappa);
其中 memset
是 <string.h>
header 的函数。
我正在尝试用 D
放在随机位置的字符填充空白二维数组(矩阵)。
这是可以正常工作的代码:
#define RIGHE 10
#define COLONNE 10
void drawMap(char[][COLONNE]);
int main()
{
char mappa[RIGHE][COLONNE] = {" "}; // blank, as an empty chess board
drawMap(mappa);
return 0;
}
/* Disegna la mappa da gioco */
void drawMap(char mappa[][COLONNE])
{
int rigaDestinazione, colonnaDestinazione;
srand(time(NULL)); // Randomizza numeri
rigaDestinazione = rand() % RIGHE;
colonnaDestinazione = rand() % COLONNE;
mappa[rigaDestinazione][colonnaDestinazione] = 'D';
for (int i = 0; i < RIGHE; i++) {
for (int j = 0; j < RIGHE; j++) {
printf("[ %c ]", mappa[i][j]);
}
printf("\n");
}
}
不幸的是,当我打印它时,它似乎是不对称的,如你所见,输出是:
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ D ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
我该如何解决?
这个:
char mappa[RIGHE][COLONNE] = {" "}; // blank, as an empty chess board
只初始化数组的第一个元素,你可以使用memset来初始化它们:
memset(mappa, ' ', sizeof(mappa)); //<-- #include <string.h>
您还应注意,要使用 ' '
而不是 " "
来初始化字符,这是针对字符串的。
为了彻底,srand(time(NULL));
只需要执行一次,可以放在main()
函数调用前
这个代码
char mappa[RIGHE][COLONNE] = {" "}; // blank, as an empty chess board
用字符串 " "
初始化数组的第一个元素,即 mappa[0]
。这使得 top-left 元素包含 ' '
(space 字符),其余行填充 NUL 字符 '[=17=]'
。所有其他行都是 zero-initialized.
与下面的例子比较:
char mappa[RIGHE][COLONNE] = {"Hello","world!"};
在这种情况下,您的输出可能是(直到放置 D
):
[ H ][ e ][ l ][ l ][ o ][ ][ ][ ][ ][ ]
[ w ][ o ][ r ][ l ][ d ][ ! ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ D ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
你真正想要的是用 space 填充整个数组,像这样:
char mappa[RIGHE][COLONNE];
memset(mappa, ' ', sizeof mappa);
其中 memset
是 <string.h>
header 的函数。