strtod函数详解

strtod是C语言中的标准函数,主要用来把字符串转换成double类型的浮点数。它的原型如下:

double strtod(const char *nptr, char **endptr);

其中nptr为待转换的字符串指针,endptr指向待转换的字符串中第一个非数字或点的字符的指针。如果没有执行任何转换,endptr指向待转换字符串的起始地址。

一、字符串转换

strtod函数的主要用途是将字符串转换成double类型的浮点数,这是它最常用的功能。在转换时,strtod会自动跳过前导空格,并处理负数、科学计数法等特殊情况。

以下是一个简单的例子:

const char *str = "3.1415926";
char *end;
double num = strtod(str, &end);

在这个例子中,strtod函数执行后num的值为3.1415926,end指针指向字符串结尾的’\0’。需要注意的是,如果待转换的字符串中包含非数字或点之外的字符,strtod函数只会转换到第一个非数字或点之前的部分,后面的内容会被忽略掉。

下面是一个包含特殊情况的例子:

const char *str = "-1.23E-4";
char *end;
double num = strtod(str, &end);

在这个例子中,待转换的字符串包含负号、小数点和科学计数法三个特殊情况。在转换时,strtod会将它们转换成对应的浮点数。执行后num的值为-0.000123,end指针指向字符串结尾的’\0’。

二、错误处理

在实际应用中,待转换的字符串可能会包含一些不能正确转换成浮点数的字符,或者指针参数传入不正确等情况。为了在这些情况下保证程序的稳定性,strtod函数提供了一些错误处理机制。

1.转换失败

如果待转换的字符串中不包含任何数字或点,或者出现了既非数字又不是点的字符,strtod函数会返回0.0并赋值全局变量errno为ERANGE。例如:

const char *str = "abc";
char *end;
double num = strtod(str, &end);
if (*end == '\0' && errno == ERANGE) {
    printf("转换失败\n");
}

在这个例子中,因为字符串中既没有数字也没有点,所以转换失败,num的值为0.0,end指针指向字符串结尾的’\0’,errno被赋值为ERANGE。

2.指针参数不正确

如果指针参数end传入了不正确的值,strtod函数也会返回0.0并赋值全局变量errno为EINVAL。例如:

const char *str = "3.14";
double num = strtod(str, NULL);
if (errno == EINVAL) {
    printf("指针参数不正确\n");
}

在这个例子中,因为指针参数end传入了NULL,所以调用函数时会返回0.0,并将errno赋值为EINVAL。

3.溢出

如果待转换的字符串表示的浮点数超出了double类型的范围,strtod函数会返回正负无穷大,并赋值全局变量errno为ERANGE。例如:

const char *str = "1e308";
char *end;
double num = strtod(str, &end);
if (*end == '\0' && errno == ERANGE) {
    printf("超出范围\n");
}

在这个例子中,因为待转换的字符串表示的浮点数超过了double类型所能表示的最大值,所以函数调用会返回正无穷大,end指针指向字符串结尾的’\0’,errno被赋值为ERANGE。

三、函数实现

strtod函数的实现可分为以下几步:

1.跳过前导空格和符号判断

strtod函数会先跳过待转换字符串中的空格和制表符等空白字符,然后判断第一个非空白字符是不是符号(+或-)。如果是,会将该符号的正负性作为标记(sign)存储下来,然后将指针向后移动一位。

2.处理小数部分

接下来,strtod函数会处理小数部分(如果有的话)。它会遍历字符串,直到遇到非数字或点的字符。在遍历的过程中,strtod会将遇到的数字按权相加的方式计算出浮点数的整数部分(integer part)和小数部分(fraction part)。例如,在处理字符串”3.14″时,strtod会先计算出整数部分3,然后根据小数点后面的数字1和4计算出小数部分0.14(1/10 + 4/100)。

3.处理指数部分

如果待转换字符串中包含科学计数法(例如3.14E5),strtod函数会处理指数部分。它会提取出E或e后面的数字作为指数(exponent),然后将整个浮点数乘以10的exponent次方。例如,在处理字符串”3.14E5″时,strtod会先计算出浮点数3.14,然后将其乘以10的5次方。

4.返回结果

最后,strtod函数会根据前面计算出来的数值、符号和指数等信息,计算出最终的浮点数,并把它返回。

下面是一个简化版的strtod函数实现:

double my_strtod(const char *nptr, char **endptr) {
    // 跳过前导空格和符号
    char *p = (char *)nptr;
    while (isspace(*p)) p++;
    int sign = 1;
    if (*p == '+') {
        p++;
    } else if (*p == '-') {
        p++;
        sign = -1;
    }

    // 处理小数部分
    double integer_part = 0.0;
    double fraction_part = 0.0;
    double divisor = 1.0;
    while (isdigit(*p) || *p == '.') {
        if (*p == '.') {
            divisor = 10.0;
            p++;
            continue;
        }
        if (divisor == 1.0) {
            integer_part = integer_part * 10.0 + (*p - '0');
        } else {
            fraction_part += (*p - '0') / divisor;
            divisor *= 10.0;
        }
        p++;
    }

    // 处理指数部分
    int exponent = 0;
    if (toupper(*p) == 'E') {
        p++;
        int exp_sign = 1;
        if (*p == '+') {
            p++;
        } else if (*p == '-') {
            p++;
            exp_sign = -1;
        }
        while (isdigit(*p)) {
            exponent = exponent * 10 + (*p - '0');
            p++;
        }
        exponent *= exp_sign;
    }

    // 返回结果
    if (endptr != NULL) {
        *endptr = p;
    }
    return sign * (integer_part + fraction_part) * pow(10, exponent);
}

四、总结

strtod函数是C语言中常用的一个函数,主要用来将字符串转换成double类型的浮点数。在实际应用中,strtod函数还会根据待转换字符串的不同情况返回不同的错误码,方便程序员进行错误处理。

本文主要阐述了strtod函数的用法和实现方法,并给出了一个简化版的实现代码,供读者参考。

原创文章,作者:FMFB,如若转载,请注明出处:https://www.506064.com/n/149431.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
FMFBFMFB
上一篇 2024-11-05 16:51
下一篇 2024-11-05 16:51

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python中capitalize函数的使用

    在Python的字符串操作中,capitalize函数常常被用到,这个函数可以使字符串中的第一个单词首字母大写,其余字母小写。在本文中,我们将从以下几个方面对capitalize函…

    编程 2025-04-29
  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • 三角函数用英语怎么说

    三角函数,即三角比函数,是指在一个锐角三角形中某一角的对边、邻边之比。在数学中,三角函数包括正弦、余弦、正切等,它们在数学、物理、工程和计算机等领域都得到了广泛的应用。 一、正弦函…

    编程 2025-04-29
  • 单片机打印函数

    单片机打印是指通过串口或并口将一些数据打印到终端设备上。在单片机应用中,打印非常重要。正确的打印数据可以让我们知道单片机运行的状态,方便我们进行调试;错误的打印数据可以帮助我们快速…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python定义函数判断奇偶数

    本文将从多个方面详细阐述Python定义函数判断奇偶数的方法,并提供完整的代码示例。 一、初步了解Python函数 在介绍Python如何定义函数判断奇偶数之前,我们先来了解一下P…

    编程 2025-04-29
  • Python实现计算阶乘的函数

    本文将介绍如何使用Python定义函数fact(n),计算n的阶乘。 一、什么是阶乘 阶乘指从1乘到指定数之间所有整数的乘积。如:5! = 5 * 4 * 3 * 2 * 1 = …

    编程 2025-04-29
  • Python函数名称相同参数不同:多态

    Python是一门面向对象的编程语言,它强烈支持多态性 一、什么是多态多态是面向对象三大特性中的一种,它指的是:相同的函数名称可以有不同的实现方式。也就是说,不同的对象调用同名方法…

    编程 2025-04-29
  • 分段函数Python

    本文将从以下几个方面详细阐述Python中的分段函数,包括函数基本定义、调用示例、图像绘制、函数优化和应用实例。 一、函数基本定义 分段函数又称为条件函数,指一条直线段或曲线段,由…

    编程 2025-04-29

发表回复

登录后才能评论