在 C 语言中转换 Char*为 Int

Jinku Hu 2023年1月30日 2021年2月28日
  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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <limits.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);
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相关文章 - C Integer