在您的代码中,char *argv[] 是由命令行提供的char* 指针数组。为了转换提供的数字,您可以使用以下内容:
-
atoi(),将字符串参数转换为整数类型。
- 或
strtol(),将字符串的初始部分转换为long int,给定一个基数。
- 来自 C99 的其他特殊功能,其中很多在 post 中进行了描述。
由于atoi() 没有错误检查,最好使用strtol(),它允许进行广泛的错误检查。
您应该将这些转换后的数字存储在动态分配的int* 指针中,这需要使用@StoryTeller 在他的回答中建议的malloc() 在堆上分配。您也可以只在堆栈上声明一个数组,例如int arr[n]。当您想在函数中返回此数组时会出现问题,这是不可能的。在这种情况下使用指针将为抽象提供更大的灵活性。
malloc()在堆上分配内存块,并返回一个void*指向它的指针。
注意: malloc() 应始终选中,因为它可以返回 NULL。最后你还需要free()这个指针。
下面是一些示例代码:
#include <stdio.h>
#include <stdlib.h>
#define BASE 10
/* Guessed that your function would look like this */
int array_sum(int *array, size_t size) {
int sum = 0;
for (size_t i = 0; i < size; i++) {
sum += array[i];
}
return sum;
}
int main(int argc, char *argv[]) {
int *arr = NULL;
char *endptr = NULL;
int check, sum;
size_t ndigits = (size_t)argc-1;
/* allocate pointer */
arr = malloc(ndigits * sizeof *arr);
if (arr == NULL) {
fprintf(stderr, "Cannot %zu spaces for integers\n", ndigits);
exit(EXIT_FAILURE);
}
for (size_t i = 0; i < ndigits; i++) {
/* sufficient checking for strtol(), more can possibly be added here */
check = strtol(argv[i+1], &endptr, BASE);
if (endptr != argv[i+1] && *endptr == '\0') {
arr[i] = check;
}
}
sum = array_sum(arr, ndigits);
printf("array_sum: %d\n", sum);
/* pointer is free'd */
free(arr);
arr = NULL;
return 0;
}
示例输入:
$ gcc -Wall -Wextra -std=c99 -o sumcommands sumcommmands.c
$ ./sumcommands 3 2 1
输出:
array_sum: 6
注意:您可以在Man page 上对strtol() 使用更多错误检查。