Así que estoy trabajando en hacer una matriz irregular en C. Creo que mi código para completar la matriz está bien, lo que tengo problemas es la impresión.

Código abajo

#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;


}

Este programa toma argumentos de línea de comando, por lo que si ingreso:

./jagged 1 3 5 1

Debería obtener:

1
1 1 1
1 1 1 1 1
1

En cambio, mi compilador solo dice

RUN FAILED
0
the_martian 14 sep. 2018 a las 06:54

4 respuestas

La mejor respuesta

Debe incluir stdlib para usar la función malloc e imprimir \ n después del primer bloque

    #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;


    }
1
Vishal 14 sep. 2018 a las 04:04

argc == 5, y argv[0] contiene ./jagged.

atoi fallará para argv[0], y su comportamiento de error no está definido. Si el programa continúa, 0 es el valor devuelto, y almacenará 0 como una de las longitudes. Esto significa que ejecutará malloc(sizeof(int) * 0); que también puede causar problemas.

Para combatir estos problemas, tiene dos opciones:

  1. Haga un bucle desde i = 1; i < argc; i++ para evitar argv[0].
  2. Agregue una línea --argc, ++argv; antes de usar cualquiera de argc o argv.

También debe considerar usar strtol en lugar de atoi ya que tiene un comportamiento de error bien definido.

Aparte de la lógica de su programa, simplemente olvidó incluir <stdlib.h> para poder utilizar malloc y atoi como explicó @Vishal.

2
14 sep. 2018 a las 04:10

Utilice algunos indicadores de compilación restrictivos, p. --pedantic --std=c11 -Wall -Wextra para gcc. Esto lo ayudará a encontrar algunos errores, como faltar, incluirse usted mismo.

Incluya stdlib.h para su llamada de malloc().

argv[0] no es su primer argumento de línea de comando, es el nombre de su binario. Entonces tienes que adaptar los bucles.

Para simplificar el caso de que no se dieron argumentos, incluya assert.h y verifique el número de argumentos al comienzo de su main con assert(argc > 1);.

Su asignación de row no es correcta pero depende de la plataforma, ya que los elementos de row son del tipo int * y no int. En su lugar, asigne row = malloc((argc - 1) * sizeof(int *));.

2
HeLLo 14 sep. 2018 a las 05:48

Fuentes de error

1> argv[0] está destinado a fallar.

2> No se incluye biblioteca para malloc (se necesita stdlib.h para eso).

1
Observer 14 sep. 2018 a las 04:12