2017-02-12 103 views
1

對不起我的問題,我知道有很多相似之處,但我沒有發現任何簡單的幫助我。如何讀取命令行參數作爲整數而不是字符串?

我已經開始用C語言編寫代碼並嘗試解決一個簡單的練習:從命令行讀取一個整數數組,使用函數array_sum和print結果來求和元素。 (3個元素的輸入實例陣列:3 0 1 2)

int array_sum(int *array, size_t size); 
int main(int argc, char **argv){ 
    int sum=array_sum(argv, argc); 
    printf("array_sum: %i\n", sum); 
    return 0; 
} 

我的問題是,argv的是char陣列和功能需要的整數數組。 我應該在一個新的int數組中逐個轉換元素嗎?有更好的方法嗎?

+2

'我應該轉換元素一一在新的int數組?'是的。 –

+0

@adev 3 0 1 2爲四個元件的陣列是嗎? –

+0

@VladfromMoscow的第一個元素是爲了數組的lenght – adev

回答

4

argv是一個指向C字符串的指針數組。您需要需要先將字符串轉換爲整數。你可以做這樣的事情:

int array_sum(int *array, size_t size); 
int main(int argc, char **argv){ 
    int *num_arr = malloc((argc - 1) * sizeof *num_arr); 

    for (int i = 0; i < argc - 1; ++i) 
     num_arr[i] = atoi(argv[i+1]); 

    int sum = array_sum(num_arr, argc - 1); 
    printf("array_sum: %i\n", sum); 

    free(num_arr); 
    return 0; 
} 

使代碼在main短的唯一方法是通過移動轉換循環到一個單獨的函數,返回malloc版指針。

+0

感謝,也沒有必要使用malloc,因爲我知道數組的lenght – adev

+1

@adev - 如果你指的是'argc'則數組的長度是可變的,你肯定需要'malloc'。儘管如果'argc'不是「太大」,你可以使用可變長度的數組。 – StoryTeller

+0

'array_sum(argv,argc)'的調用不會被編譯。想必你打算'array_sum(num_arr,(爲size_t)ARGC-1)'。 – Peter

0

爲什麼你需要通過一個int數組作爲參數的函數?無需創建一個額外的int數組時,你可以簡單地這樣做:

int array_sum(char **argv, int argc){ 
    int sum = 0; 
    for(int i = 0;i < argc - 1;i++){ 
    sum += atoi(argv[i]) 
    } 
    return sum; 
} 
+0

是的,但只有在使用'array_sum'的要求可以放寬的情況下才可行 – StoryTeller

+0

是@StoryTeller,我必須使用提供的函數。鍛鍊我覺得目的是接口 – adev

0

可以使用的atoi()函數來字符轉換**數組** INT。我在這裏看到的是你鍵入的每個整數都轉換成字符串而不是char

2

在您的代碼中,char *argv[]是從命令行提供的char*指針的數組。爲了轉換提供的數字,您可以使用以下內容:

  • atoi(),它將字符串參數轉換爲整數類型。
  • 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

+0

感謝解釋:) – adev

相關問題