c - 战舰 | 来自 char 数组的垃圾打印输出
问题描述
我正在开发战舰游戏,我正在尝试为游戏板制作一个字符数组。我想到的是一个大小为 11x21 的矩形阵列。像这样的东西,
0 1 2 3 4 5 6 7 8 9 10 / 1 2 3 4 5 6 7 8 9 10
1 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
2 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
3 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
4 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
5 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
6 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
7 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
8 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
9 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
10 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
我要做的是稍后拥有单独的数组并将历史镜像到该板并将其打印到日志文件中。
问题是现在我被困在初始化这个 11x21 板。由于某种原因,棋盘被初始化到第 6 行,即 gameboard[6][0] = 6 处的第一个值。
然后,从第 7 行开始,gameboard[7][0] 的第一个值变成了一个字母。
我怀疑这些字母弄乱了数据,然后导致打印成为垃圾。但我不确定我到底哪里出错了。
这是原始代码:
int i = 0, j = 0;
char gameboard[11][22] = {'\0'};
for (i = 0; i < 11; ++i)
{
gameboard[i][0] = (char)i;
gameboard[i][11] = (char)i;
for (j = 1; j < 11; ++j)
{
gameboard[i][j] = '~';
gameboard[i][j + 11] = '~';
}
}
for (i = 0; i < 11; i++)
{
for (j = 0; j < 22; j++)
printf(" %c", gameboard[i][j]);
printf("\n");
}
解决方案
使用字符数组时,不要尝试将其与整数值混合。这些整数值将被解释为它们的字符等价物。这是一个将整数值映射到它们所代表的字符的图表。不要这样做,而是尝试依靠数组中的索引来确定行/列号。
以下代码将其作为输出生成:
0 1 2 3 4 5 6 7 8 9 10 /1 2 3 4 5 6 7 8 9 10
1 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
2 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
3 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
4 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
5 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
6 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
7 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
8 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
9 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
10 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
int i = 0, j = 0;
char gameboard[10][21];
for (i = 0; i < 10; ++i) {
for (j = 0; j < 10; ++j) {
gameboard[i][j] = '~';
gameboard[i][j + 11] = '~';
}
}
for (i = 0; i < 10; i++) {
gameboard[i][10] = '/';
}
printf("0 ");
for (i = 0; i < 21; i++) {
j = i < 11 ? i+1 : i - 10;
if (i == 10)
printf("/");
else {
printf("%d ", j);
}
}
printf("\n");
for (i = 0; i < 10; i++) {
printf("%d", i + 1);
if (i + 1 <= 9)
printf(" ");
for (j = 0; j < 21; j++)
printf(" %c", gameboard[i][j]);
printf("\n");
}