2017-02-12 129 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

相关问题