В вашем коде char *argv[]
представляет собой массив указателей char*
, предоставленных из командной строки. Для того, чтобы преобразовать число поставки, вы можете использовать следующее:
atoi()
, который преобразует строку arguement к целому типу.
- Или
strtol()
, который преобразует начальную часть строки в long int
, учитывая базу.
- Другие специальные функции от C99, многие из которых описаны в этом post.
С 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 первый элемент был рассчитан на длину массива – adev