在您的代碼中,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