Кривый 2D-массив при печати на стандартный вывод (заполнение пустого 2D-массива) - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь заполнить пустой двумерный массив (матрицу) символом 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");
    }

}

К сожалению, когда я его печатаю, кажется, что асимметрия c, как вы можете видеть, вывод:

[   ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][ D ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]

Как я могу исправить?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Этот код

char mappa[RIGHE][COLONNE] = {" "}; // blank, as an empty chess board

инициализирует первый элемент массива, т.е. mappa[0], строкой " ". Это заставляет верхний левый элемент содержать ' ' (пробел), а оставшаяся строка заполняется символами NUL, '\0'. Все остальные строки инициализируются нулями.

Сравните со следующим примером:

char mappa[RIGHE][COLONNE] = {"Hello","world!"};

В этом случае ваш вывод может быть (вплоть до размещения D):

[ H ][ e ][ l ][ l ][ o ][  ][  ][  ][  ][  ]
[ w ][ o ][ r ][ l ][ d ][ ! ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][ D ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]
[  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]

На самом деле вы хотите заполнить весь массив пробелами, например:

    char mappa[RIGHE][COLONNE];
    memset(mappa, ' ', sizeof mappa);

, где memset - функция из заголовка <string.h>.

2 голосов
/ 15 февраля 2020

This:

char mappa[RIGHE][COLONNE] = {" "}; // blank, as an empty chess board

Инициализирует только первый элемент массива, вы можете использовать memset для их инициализации:

memset(mappa, ' ', sizeof(mappa)); //<-- #include <string.h>

Live sample

Вы также должны заметить, что для инициализации символа вы используете ' ', а не " ", это для строк.

Чтобы быть точным, srand(time(NULL)); нужно выполнить только один раз Вы можете поместить его в main() перед вызовом функции.

...