Печать неровного массива в c - PullRequest
0 голосов
/ 14 сентября 2018

так что я работаю над созданием зубчатого массива в C. Я думаю, мой код для заполнения массива в порядке, с чем у меня проблемы - это печать.

Код ниже

#include <stdio.h>

int *length;
int **row;

int main(int argc, char *argv[]) {

    //make an array that contains the lengths of the columns for each row
    length = malloc(argc * sizeof (int));
    for (int k = 0; k < argc; k++) {
        length[k] = atoi(argv[k]);
       // printf("%d ", lengths[k]);
    }
    row = malloc(argc * sizeof (int));

    // fill the columns
    int fill = 1;
    for (int i = 0; i < argc; i++) {
        row[i] = malloc(sizeof (int) * length[i]);
        for (int j = 0; j < length[i]; j++)
            row[i][j] = fill;

    }

    //print it
    for (int i = 0; i < argc; i++)
        for (int j = 0; j < length[i]; j++)
            printf("%d", row[i][j]);

    return 0;


}

Эта программа принимает аргументы командной строки, поэтому, если я введу:

./jagged 1 3 5 1

, я должен получить:

1
1 1 1
1 1 1 1 1
1

Вместо этого мой компилятор просто говорит

RUN FAILED

Ответы [ 4 ]

0 голосов
/ 14 сентября 2018

Используйте некоторые ограничительные флаги компилятора, например, --pedantic --std=c11 -Wall -Wextra для gcc.Это поможет вам найти некоторые ошибки, такие как отсутствие включает вас самих.

Включить stdlib.h для вашего вызова malloc().

argv[0] не ваш первый аргумент командной строки, этоимя вашего двоичного файлаТаким образом, вы должны адаптировать циклы.

Чтобы упростить случай, когда не было задано ни одного аргумента, включите assert.h и проверьте количество аргументов в начале вашего main с помощью assert(argc > 1);.

Ваше распределение row не является правильным, но зависит от платформы, поскольку элементы row имеют тип int *, а не int.Вместо этого выделите row = malloc((argc - 1) * sizeof(int *));.

0 голосов
/ 14 сентября 2018

вам нужно включить stdlib для использования функции malloc и печатать \ n после первого блока

    #include <stdio.h>
    #include <stdlib.h>
    int *length;
    int **row;

    int main(int argc, char *argv[]) {

        //make an array that contains the lengths of the columns for each row
        length = malloc(argc * sizeof (int));
        for (int k = 0; k < argc; k++) {
            length[k] = atoi(argv[k]);
           // printf("%d ", lengths[k]);
        }
        row = malloc(argc * sizeof (int));

        // fill the columns
        int fill = 1;
        for (int i = 0; i < argc; i++) {
            row[i] = malloc(sizeof (int) * length[i]);
            for (int j = 0; j < length[i]; j++)
                row[i][j] = fill;

        }

        //print it
        for (int i = 0; i < argc; i++)
        {
            for (int j = 0; j < length[i]; j++){
                printf("%d", row[i][j]);
            }
            printf("\n");
        }

        return 0;


    }
0 голосов
/ 14 сентября 2018

Источники ошибок

1> argv[0] обязательно завершится с ошибкой.

2> Нет библиотеки, включенной для malloc (для этого нужно stdlib.h).

0 голосов
/ 14 сентября 2018

argc == 5 и argv[0] содержит ./jagged.

atoi завершится с ошибкой для argv[0], и его поведение ошибки не определено.Если программа продолжается, 0 - это возвращаемое значение, и вы сохраните 0 как одну из длин.Это означает, что вы будете выполнять malloc(sizeof(int) * 0);, что также может вызвать проблемы.

Для борьбы с этими проблемами у вас есть два варианта:

  1. Цикл из i = 1; i < argc; i++, чтобы избежать argv[0].
  2. Добавьте строку --argc, ++argv; перед использованием argc или argv.

Вам также следует рассмотреть возможность использования strtol вместо atoi в качествев ней четко определено поведение ошибки.

Кроме логики вашей программы, вы просто забыли включить <stdlib.h>, чтобы иметь возможность использовать malloc и atoi , как объяснил @Vishal .

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