In Ihrem Code ist char *argv[]
ein Array von char*
Zeigern, die über die Befehlszeile bereitgestellt werden. Um die gelieferten Nummern zu konvertieren, können Sie Folgendes verwenden:
atoi()
, die String Argument in einen Integer-Typ konvertiert.
Oder strtol()
, die den Anfangsteil einer Zeichenfolge in eine long int
konvertiert, eine Basis gegeben.
Andere Sonderfunktionen von C99, von denen viele in dieser post beschrieben sind.
Da atoi()
keine Fehlerprüfung hat, ist es am besten, strtol()
zu verwenden, das umfangreiche Fehlerprüfung ermöglicht.
Sie sollten diese konvertierten Zahlen in einem dynamisch zugeordneten int*
Zeiger speichern, der auf dem Heap unter Verwendung von malloc()
zugeordnet werden muss, was von @StoryTeller in seiner Antwort vorgeschlagen wurde. Sie können auch einfach ein Array auf dem Stack deklarieren, z. B. int arr[n]
. Das Problem tritt auf, wenn Sie dieses Array in einer Funktion zurückgeben wollen, was nicht möglich ist. Die Verwendung eines Zeigers würde in diesem Fall mehr Flexibilität für die Abstraktion ermöglichen.
malloc()
ordnet Speicherblock auf der Halde, und gibt einen Zeiger darauf void*
.
Hinweis:malloc()
sollte immer geprüft werden, da es NULL
zurückkehren kann. Sie müssen auch diesen Zeiger am Ende free()
. Hier
ist einige Beispiel-Code:
#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;
}
Beispiel Eingabe:
$ gcc -Wall -Wextra -std=c99 -o sumcommands sumcommmands.c
$ ./sumcommands 3 2 1
Ausgang:
array_sum: 6
Hinweis: können Sie mehr Fehler verwenden Überprüfung auf strtol()
auf die Man page
.
'Soll ich Elemente einzeln in einem neuen int-Array konvertieren?' Ja. –
@adev 3 0 1 2 ist eine Anordnung von vier Elementen, nicht wahr? –
@VladfromMoscow das erste Element war die Länge des Arrays – adev