在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 == 5
,argv[0]
包含 ./jagged
.
atoi
将因 argv[0]
而失败,其错误行为未定义。如果程序继续,则返回值为 0,您会将 0 存储为其中一个长度。这意味着您将执行 malloc(sizeof(int) * 0);
,这也可能会导致麻烦。
要解决这些问题,您有两个选择:
- 从
i = 1; i < argc; i++
循环以避免 argv[0]
.
- 在使用
argc
或 argv
之前添加一行 --argc, ++argv;
。
您还应该考虑使用 strtol
而不是 atoi
,因为它具有明确定义的错误行为。
除了您的程序逻辑,您只是忘记包含 <stdlib.h>
以便能够使用 malloc
和 atoi
.
您需要包含 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 *));
.
所以我正在用 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 == 5
,argv[0]
包含 ./jagged
.
atoi
将因 argv[0]
而失败,其错误行为未定义。如果程序继续,则返回值为 0,您会将 0 存储为其中一个长度。这意味着您将执行 malloc(sizeof(int) * 0);
,这也可能会导致麻烦。
要解决这些问题,您有两个选择:
- 从
i = 1; i < argc; i++
循环以避免argv[0]
. - 在使用
argc
或argv
之前添加一行--argc, ++argv;
。
您还应该考虑使用 strtol
而不是 atoi
,因为它具有明确定义的错误行为。
除了您的程序逻辑,您只是忘记包含 <stdlib.h>
以便能够使用 malloc
和 atoi
您需要包含 stdlib
才能使用 malloc
函数并在第一个块
#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);
.
您对 row
的分配不正确,但与平台有关,因为 row
的元素属于 int *
而不是 int
类型。而是分配 row = malloc((argc - 1) * sizeof(int *));
.