在您的代码中,char *argv[]
是从命令行提供的char*
指针的数组。为了转换提供的数字,您可以使用以下内容:
由于atoi()
有没有错误检查,最好是使用strtol()
,这使得大量的错误检查。
你应该在一个动态分配的int*
指针,这将需要使用malloc()
堆,这是在他的回答提出由@StoryTeller来分配存储这些转换数字。你也可以在栈上声明一个数组,例如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
注:您可以在使用更多的错误检查strtol()
Man page
。
'我应该转换元素一一在新的int数组?'是的。 –
@adev 3 0 1 2为四个元件的阵列是吗? –
@VladfromMoscow的第一个元素是为了数组的lenght – adev