如何将命令行参数读取为整数而不是字符串?
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 malloc
ed 指针。
为什么需要将 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()
,这样可以进行广泛的错误检查。
您应该将这些转换后的数字存储在一个动态分配的 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()
使用更多错误检查
抱歉我的问题,我知道有很多相似之处,但我没有找到任何简单的足以帮助我的问题。
我已经开始用 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 malloc
ed 指针。
为什么需要将 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()
,这样可以进行广泛的错误检查。
您应该将这些转换后的数字存储在一个动态分配的 int*
指针中,这将需要使用 malloc()
在堆上分配,这是@StoryTeller 在他的回答中建议的。您也可以只在堆栈上声明一个数组,例如 int arr[n]
。当你想在一个函数中 return 这个数组时,问题就出现了,这是不可能的。在这种情况下使用指针将允许更灵活的抽象。
malloc()
allocates block of memory on the heap, and returns avoid*
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()
使用更多错误检查