链接列表的数组

时间:2015-03-31 22:10:54

标签: c

这是在C.

我必须从命令行获取信息(例如./command ###),然后通过命令运行信息,然后打印后续信息。

int *numbers = malloc(sizeof(argc)*sizeof(int));
int i = 0;
while (i<argc) {
    numbers[i] = atoi(argv[i+1]);
    i++;
   }

Node *a = arrayToList(numbers,sizeof(numbers)/sizeof(int));
Node *b = mapList(decrement,a);
displayList(b);

return 0;

它意味着返回少一个的值,但我很难将数字读入原始数组。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

代码的第一部分应该是

if ( argc < 2 )
    exit( 1 );     // need at least one arg after the command name

int numbers[argc-1];
for ( int i = 1; i < argc; i++ )
    numbers[i-1] = atoi(argv[i]);

您需要为int分配空间,然后将1中的参数处理为argc-1

答案 1 :(得分:1)

用于解决任何可能的混淆的视觉

您似乎对数组索引始终从0开始,并且计数总是从1开始这一事实感到有些困惑:

      index    count    value of argv[i]
    (argc-1)  (argc)

argv[    0]       1     "./my_program"
argv[    1]       2     "4"
argv[    2]       3     "8"
.
.
argv[N - 3]   N - 2     "128"
argv[N - 2]   N - 1     "256"
argv[N - 1]       N     "512"
argv[N    ]             NULL

如果你不感到困惑,我道歉,但我希望这有助于澄清事情。

numbers数组

的分配

您的代码建议您只需要命令行参数,因此您需要argc数组的元素1到argv(不包含):

1 <= i < argc                (mathematically)
for (i = 1; i < argc; ++i)   (equivalent C code)

因此,您需要从argc中减去1,并将该值用作数组中元素的数量:

int count = argc - 1;

/*
 * int numbers[count];
 *
 * would work too if your compiler supports variable-length arrays (VLAs).
 *
 * That means you don't need to call `free(numbers);` at the end,
 * but it also means you may run out of stack space if a lot of
 * arguments are passed. Sometimes `malloc` is just a better option.
 */
int *numbers = malloc(count * sizeof(*numbers));

读取循环

然后你的循环将如下所示:

for (i = 1; i < argc; ++i)
    numbers[i - 1] = atoi(argv[i]);

如果您感到困惑,请记住您将argv[3]作为号码存储到numbers[2]中。 3-1 = 2,对吗?换句话说,numbers的索引为i - 1,其中iargv的索引。如果您想知道为什么我没有使用

for (i = 0; i < argc - 1; ++i)
    numbers[i] = atoi(argv[i + 1]);

它是因为除了两个循环中相同的增量操作外,只有一个操作(减法)而不是两个操作(减法和加法)。

读取循环后

在该循环之后,只要您需要访问count数组中的值,您就可以从0循环到0 <= i < count numbers,并将count传递给/* Print all the numbers in the array to verify they were read correctly. */ printf("Numbers:"); for (i = 0; i < count; i++) printf(" %d", numbers[i]); printf("\n"); Node *a = arrayToList(numbers, count); 需要知道数组中有多少项的函数,等等:

free(numbers);

如果您使用malloc,请在计划退出前忘记count

如果你想知道......

如果你想知道为什么你会通过sizeof(numbers)/sizeof(int),那么,我首先会问你为什么不能这样做?哪个更具可读性:countsizeof

更重要的是,如果您使用malloc,则numbers方法将无效,因为int *是一个指针,并且没有{{1}}大小以外的大小信息类型,与具有有关其大小信息的数组不同。请参阅Arrays and Pointers on the C FAQ以获取足够的信息来解释短语&#34;指针不是数组&#34;和#34;数组不是指针&#34;。