如何将命令行参数读取为整数而不是字符串?

How to read command-line arguments as integers instead of strings?

抱歉我的问题,我知道有很多相似之处,但我没有找到任何简单的足以帮助我的问题。

我已经开始用 C 编写代码并尝试解决一个简单的练习:从命令行读取一个整数数组,使用函数 array_sum 对元素求和并打印结果。 (输入 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 是一个字符数组,而函数需要一个整数数组。 我应该在一个新的 int 数组中一个一个地转换元素吗?还有更好的方法吗?

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 中的代码更短的唯一方法是将转换循环移动到一个单独的函数中,returns malloced 指针。

为什么需要将 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;
}

您可以使用 atoi() 函数将 char ** 数组转换为 **int 。我在这里看到的是您键入的每个整数都转换为 string 而不是 char.

在您的代码中,char *argv[] 是一个由命令行提供的 char* 指针组成的数组。为了转换提供的数字,您可以使用以下内容:

  • atoi(),将字符串参数转换为整数类型。
  • strtol(),将字符串的初始部分转换为 long int,给定一个基数。
  • 来自 C99 的其他特殊函数,其中很多在 post.
  • 中有描述

由于atoi()没有错误检查,最好使用strtol(),这样可以进行广泛的错误检查。

您应该将这些转换后的数字存储在一个动态分配的 int* 指针中,这将需要使用 malloc() 在堆上分配,这是@StoryTeller 在他的回答中建议的。您也可以只在堆栈上声明一个数组,例如 int arr[n]。当你想在一个函数中 return 这个数组时,问题就出现了,这是不可能的。在这种情况下使用指针将允许更灵活的抽象。

malloc()allocates block of memory on the heap, and returns a void* pointer to it.

注意: malloc() 应始终检查,因为它可以 return 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 == '[=10=]') {
            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

注意: 您可以在 Man page.

上对 strtol() 使用更多错误检查