在 C 语言中转换 Char*为 Int
Jinku Hu
2023年10月12日
本文将介绍几种在 C 语言中如何将 char*
转换为 int 的方法。
使用 strtol
函数在 C 语言中把 char*
转换为 int
strtol
函数是 C 标准库的一部分,它可以将 char*
数据转换成用户指定的长整数值。该函数需要 3 个参数,其中第一个参数是字符串所在的指针。注意,这个 char
指针参数是不被修改的,有一个 const
限定符。第二个参数可以利用它来存储遇到的第一个无效字符,或者在没有找到数字的情况下存储整个字符串。第三个参数指定要转换的数字的基数,这个参数的值应该在 2 和 36 之间。下面的例子显示了如何将 char*
数组中的元素转换为整数并输出到控制台。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printIntegers(long int arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
char *arr[] = {"12", "33", "43", "23", "90"};
size_t len = sizeof arr / sizeof arr[0];
long int arr3[len];
for (int i = 0; i < len; ++i) {
arr3[i] = strtol(arr[i], NULL, 10);
}
printIntegers(arr3, len);
exit(EXIT_SUCCESS);
}
输出:
12 | 33 | 43 | 23 | 90 |
作为另一种选择,我们可以将程序参数作为输入字符串,并将其转换为整数类型。注意,我们需要使用 int argc,char* argv[]
作为 main
函数的参数来访问程序参数并进行处理。接下来的示例代码将检查用户提供的程序参数是否至少是单一参数,如果不是,则退出显示相应的错误信息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printIntegers(long int arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
exit(EXIT_FAILURE);
}
long int arr2[argc - 1];
for (int i = 0; i < argc - 1; ++i) {
arr2[i] = strtol(argv[i + 1], NULL, 10);
}
printIntegers(arr2, argc - 1);
exit(EXIT_SUCCESS);
}
在 C 语言中正确验证 strtol
函数将 char*
转换为 int
的结果
即使我们在前面的例子中成功地使用 strtol
调用将作为程序参数传递的字符串转换为整数,但给定的程序仍有很大的可能性会失败。建议为 strtol
函数调用实现错误检查例程,以保证程序的稳健执行并有相应的错误记录。我们将检查转换后的整数是否在 long
类型的范围内,以及转换本身是否不成功。此外,我们还会检查有效整数后面是否有字符,给定的输入是否是十进制数。不过请注意,在每种情况下,我们都会将错误信息打印到 stderr
流中,而不会终止程序,但你应该根据你的需求考虑另一个处理例程。
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printIntegers(long int arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%4ld | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: ./%s int1 int2 int3...\n", argv[0]);
exit(EXIT_FAILURE);
}
long int num;
char *endptr, *str = argv[1];
errno = 0;
long ret = strtol(str, &endptr, 10);
if (str == endptr) {
fprintf(stderr, "%s: not a decimal number\n", str);
} else if ('\0' != *endptr) {
fprintf(stderr, "%s: extra characters at end of input: %s\n", str, endptr);
} else if ((LONG_MIN == ret || LONG_MAX == ret) && ERANGE == errno) {
fprintf(stderr, "%s out of range of type long\n", str);
} else if (errno != 0 && ret == 0) {
fprintf(stderr, "%s no conversion was performed\n", str);
} else {
num = ret;
printf("num: %ld\n", num);
}
exit(EXIT_SUCCESS);
}
作者: Jinku Hu