Заполнение и печать двумерного массива - PullRequest
0 голосов
/ 07 февраля 2019

Итак, у меня есть 2D-массив, который я хочу использовать позже.Прямо сейчас я просто хочу заполнить пустые места.

До сих пор я просто возился с типами массивов и различными значениями по умолчанию.Насколько я понимаю, новый массив заполнен '0', я попытался также NULL.

int r = 5;
int c = 5;
int i;
int j;
int k = 0;
int area = r*c;

const char *array[r][c]; //tried char array[r][c] and other types

Установите мои начальные значения и массив здесь.

while(k< area){
    for (j = 0; j < c; j++){
        for (i = 0; i<r; i++){
            if (array[i][j] == 0){
                board[i][j] = ".";
            }
            printf("%c",aray[i][j]); 
            if (i = r - 1){
                printf("\n");
            }
            k++;

        }
    }

}

Вот где я пытаюсьзаменяя все незаполненные значения (все они на данный момент) на «.», так что вывод должен быть строкой 5x5 точек.Вместо этого я получаю странные буквы и цифры.Я пробовал% s InSad% C, и не повезло, но результат был другим.Где я делаю% s, я получаю некоторые точки, но все еще не в сетке, и странные значения отображаются.

Также я почти уверен, что printf в цикле for, по умолчанию делает это на новой строке, поэтому я выигралне получить сетку, так есть ли лучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

У вас есть несколько проблем:

  1. Вы объявляете указатель на нужный вам массив, а не массив
  2. Всякий раз, когда R и C не известны во время компиляции, вы можете 'т использовать встроенный массив.Однако вы можете использовать VLA (C99, поскольку только в стандарте C есть обязательные VLA, C11 снова сделал их необязательными), который выглядит как встроенный массив с размером, неизвестным во время компиляции, но имеет очень важные последствия, см .: https://stackoverflow.com/a/54163435/3537677
  3. Ваш массив заполнен только нулем, когда объявлен как статическая переменная.
  4. Вы, похоже, ошиблись оператором присвоения = с равным оператором ==

Итак, угадав, что вы хотите:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define R 5
#define C 5
int r = R;
int c = C;
int i;
int j;
int k = 0;
int area = R*C;

const char array[R][C];


int main() {
    while(k< area){
        for (j = 0; j < c; j++){
            for (i = 0; i<r; i++){
                if (array[i][j] == 0){

                }
                printf("%c",array[i][j]);
                if (i == r - 1){
                    printf("\n");
                }
                k++;

            }
        }

    }

    //or

    char** dynamic_array = malloc(r * c);
    if (dynamic_array == NULL) {
        perror("Malloc of dynamic array failed");
        return EXIT_FAILURE;
    }
    memset(dynamic_array, '0', r*c);

    k = 0;

    while(k< area){
        for (j = 0; j < c; j++){
            for (i = 0; i<r; i++){
                if (dynamic_array[i][j] == 0){

                }
                printf("%c",dynamic_array[i][j]);
                if (i == r - 1){
                    printf("\n");
                }
                k++;

            }
        }

    }

    return 0;
}
0 голосов
/ 07 февраля 2019

То, что у вас есть, это массив указателей.Это подходит для двумерного массива строк, но не для двумерного массива символов.Это не ясно из вашего вопроса, поэтому я предполагаю, что вы действительно хотите двумерный массив символов.Синтаксис: char array [r][c];.

Примечательно, поскольку вы использовали r и c, которые являются переменными времени выполнения, этот массив представляет собой массив переменной длины (VLA),Такой массив не может быть размещен в области видимости файла («глобальный»).Поместите массив в функцию типа main().

. Чтобы использовать VLA, у вас также должен быть стандартный компилятор Си.Компиляторы C ++ и компиляторы динозавров не будут работать.

Поскольку вам придется объявлять VLA внутри функции, он получает «длительность автоматического хранения».Это означает, что не автоматически обнуляется.При необходимости вы должны сделать это самостоятельно: memset(array, 0, sizeof array);.Но вы, вероятно, хотите инициализировать его каким-то конкретным символом вместо 0.

Пример:

#include <stdio.h>
#include <string.h>

int main (void)
{
  int r = 5;
  int c = 5;
  char array [r][c];
  memset(array, '#', sizeof array);

  for(size_t i=0; i<r; i++)
  {
    for(size_t j=0; j<c; j++)
    {
      printf("%c", array[i][j]);
    }
    printf("\n");
  }
}

Вывод:

#####
#####
#####
#####
#####
0 голосов
/ 07 февраля 2019

Насколько я понимаю, новый массив заполнен '0'

const char *array[r][c];

Нет *, вы должны заполнить его самостоятельнов двойном цикле for, например:

for(int i = 0; i < r; ++i)
  for(int j = 0; j < c; ++j)
    array[i][j] = 0

, поскольку ваша структура представляет собой массив переменного размера.

Вместо этого я получаю странные буквы и цифры

Это происходит потому, что ваш код вызывает Undefined Behavior (UB).

В частности, ваш массив неинициализирован, затем вы пытаетесь назначить ячейки символу точки, если их значение уже равно 0.

Поскольку массив не инициализирован, значения его ячеек являются ненужными, поэтому ни один из них не удовлетворял условию равного 0, поэтому ни один не был назначен с символом точки.

Затем вы печатаете массив, который все ещесодержит значения мусора (поскольку он никогда не был инициализирован вами), а выходные данные - значения мусора.


* Как указано @hyde, это верно для локальных нестатических массивов (что, скорее всего, ваш случай).Статика и глобальные переменные инициализируются по умолчанию (в ноль, если это было здесь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...