在 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>

Live sample

您还应注意,要使用 ' ' 而不是 " " 来初始化字符,这是针对字符串的。

为了彻底,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 的函数。