在c中打印锯齿状数组

Printing a jagged array in c

所以我正在用 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

argc == 5argv[0] 包含 ./jagged.

atoi 将因 argv[0] 而失败,其错误行为未定义。如果程序继续,则返回值为 0,您会将 0 存储为其中一个长度。这意味着您将执行 malloc(sizeof(int) * 0);,这也可能会导致麻烦。

要解决这些问题,您有两个选择:

  1. i = 1; i < argc; i++ 循环以避免 argv[0].
  2. 在使用 argcargv 之前添加一行 --argc, ++argv;

您还应该考虑使用 strtol 而不是 atoi,因为它具有明确定义的错误行为。

除了您的程序逻辑,您只是忘记包含 <stdlib.h> 以便能够使用 mallocatoi .

您需要包含 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;


    }

错误来源

1> argv[0] 注定要失败。

2> 没有包含 malloc 的库(为此需要 stdlib.h)。

使用一些限制性的编译器标志,例如--pedantic --std=c11 -Wall -Wextra 用于 gcc。这将帮助您找到一些错误,例如 missing includes yourself。

malloc().

的调用添加 stdlib.h

argv[0] 不是您的第一个命令行参数,它是您的二进制文件的名称。所以你必须调整循环。

为了简化没有给出参数的情况,包括 assert.h 并用 assert(argc > 1);.

检查 main 开头的参数数量

您对 row 的分配不正确,但与平台有关,因为 row 的元素属于 int * 而不是 int 类型。而是分配 row = malloc((argc - 1) * sizeof(int *));.