首页 > 编程笔记 > C语言笔记

C语言字符串转数字的5种方法(附带示例)

在C语言编程中,将字符串转换为数字是一个常见的操作,这种转换在处理用户输入、解析配置文件或处理文本数据时尤为有用。
 

C语言主要提供了三个函数用于将字符串转换为数字,分别是 atoi()、atol() 和 atof(),它们都定义在 <stdlib.h> 头文件中。此外,还有一些更高级的函数如 strtol()、strtoul() 和 strtod(),它们提供了更多的控制和错误处理能力。

1. atoi() 函数

atoi() 函数用于将字符串转换为整数(int 类型),它的名称是“ASCII to Integer”的缩写。这个函数会忽略字符串开头的空白字符,然后尝试将后续字符解析为整数。如果遇到非数字字符,函数就会停止解析。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char str1[] = "123";
    char str2[] = "  -456abc";
    char str3[] = "789.123";

    int num1 = atoi(str1);
    int num2 = atoi(str2);
    int num3 = atoi(str3);

    printf("str1 转换结果:%d\n", num1);
    printf("str2 转换结果:%d\n", num2);
    printf("str3 转换结果:%d\n", num3);

    return 0;
}

输出结果:

str1 转换结果:123
str2 转换结果:-456
str3 转换结果:789

从这个例子中,我们可以看到 atoi() 函数的几个特点:

2. atol() 函数

atol() 函数的工作原理与 atoi() 类似,但它返回的是 long int 类型的值,这使得它可以处理更大范围的整数。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char str[] = "1234567890";
    long int num = atol(str);
    printf("转换结果:%ld\n", num);
    return 0;
}

输出结果:

转换结果:1234567890

3. atof() 函数

atof() 函数用于将字符串转换为浮点数(double 类型),它可以处理带小数点的数字,以及使用科学记数法表示的数字。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char str1[] = "3.14159";
    char str2[] = "-2.718e2";
    char str3[] = "6.022E23";

    double num1 = atof(str1);
    double num2 = atof(str2);
    double num3 = atof(str3);

    printf("str1 转换结果:%f\n", num1);
    printf("str2 转换结果:%f\n", num2);
    printf("str3 转换结果:%e\n", num3);

    return 0;
}

输出结果:

str1 转换结果:3.141590
str2 转换结果:-271.800000
str3 转换结果:6.022000e+23

这个例子展示了 atof() 函数如何处理不同格式的浮点数,包括普通小数、带负号的数字和科学记数法表示的数字。
 

虽然 atoi()、atol() 和 atof() 函数使用起来非常方便,但它们也有一些局限性。最主要的问题是,这些函数无法区分转换失败和成功转换为零的情况。例如,如果我们尝试将 "hello" 转换为数字,atoi() 会返回 0,这与将 "0" 转换为数字的结果相同。
 

为了解决这个问题,C语言提供了一些更高级的函数,如 strtol()、strtoul() 和 strtod()。这些函数不仅可以进行更精确的转换,还能提供更好的错误处理能力。

4. strtol() 函数

strtol() 函数可以将字符串转换为长整型(long int),它的优势在于可以指定数字的基数(例如二进制、八进制或十六进制),并且可以检测转换是否成功。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main() {
    char str1[] = "1234";
    char str2[] = "0xFF";
    char str3[] = "hello";
    char *endptr;

    long int num1 = strtol(str1, &endptr, 10);
    long int num2 = strtol(str2, &endptr, 16);
    long int num3 = strtol(str3, &endptr, 10);

    if (errno == ERANGE) {
        printf("转换出错:数值超出范围\n");
    } else {
        printf("str1 转换结果:%ld\n", num1);
        printf("str2 转换结果:%ld\n", num2);
        if (endptr == str3) {
            printf("str3 转换失败\n");
        } else {
            printf("str3 转换结果:%ld\n", num3);
        }
    }

    return 0;
}

输出结果:

str1 转换结果:1234
str2 转换结果:255
str3 转换失败

在这个例子中,我们使用 strtol() 函数转换了三个不同的字符串。函数的第二个参数 &endptr 是一个指向 char 指针的指针,它会被设置为指向转换停止的位置。第三个参数指定了数字的基数(10 表示十进制,16 表示十六进制)。通过检查 errno 和 endptr,我们可以判断转换是否成功,以及是否发生了范围溢出。

5. strtod() 函数

strtod() 函数用于将字符串转换为双精度浮点数(double),它的使用方式类似于 strtol(),但不需要指定基数。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main() {
    char str1[] = "3.14159";
    char str2[] = "1.23e-4";
    char str3[] = "invalid";
    char *endptr;

    double num1 = strtod(str1, &endptr);
    double num2 = strtod(str2, &endptr);
    double num3 = strtod(str3, &endptr);

    if (errno == ERANGE) {
        printf("转换出错:数值超出范围\n");
    } else {
        printf("str1 转换结果:%f\n", num1);
        printf("str2 转换结果:%e\n", num2);
        if (endptr == str3) {
            printf("str3 转换失败\n");
        } else {
            printf("str3 转换结果:%f\n", num3);
        }
    }

    return 0;
}

输出结果:

str1 转换结果:3.141590
str2 转换结果:1.230000e-04
str3 转换失败

这个例子展示了 strtod() 函数如何处理不同格式的浮点数,以及如何检测转换失败的情况。

 

通过掌握这些字符串转数字的技巧,我们可以更加灵活和安全地处理各种数据转换需求,无论是处理用户输入、解析配置文件,还是进行数据分析,这些知识都将派上用场。

相关文章