这是在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;
它意味着返回少一个的值,但我很难将数字读入原始数组。
有什么想法吗?
答案 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
,其中i
是argv
的索引。如果您想知道为什么我没有使用
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)
,那么,我首先会问你为什么不能这样做?哪个更具可读性:count
或sizeof
?
更重要的是,如果您使用malloc
,则numbers
方法将无效,因为int *
是一个指针,并且没有{{1}}大小以外的大小信息类型,与具有有关其大小信息的数组不同。请参阅Arrays and Pointers on the C FAQ以获取足够的信息来解释短语&#34;指针不是数组&#34;和#34;数组不是指针&#34;。