在 C 语言中转换 Char*为 Int

Jinku Hu 2023年10月12日
  1. 使用 strtol 函数在 C 语言中把 char*转换为 int
  2. 在 C 语言中正确验证 strtol 函数将 char*转换为 int 的结果
在 C 语言中转换 Char*为 Int

本文将介绍几种在 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
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C Integer