文章目录
strtod函数避坑
strtod()
函数定义在<stdlib.h>
头文件中,声明为:double strtod(const char *restrict nptr, char **restrict endptr)
- nptr-- 要转换为双精度浮点数的字符串。
- endptr – 对类型为 char* 的对象的引用,其值由函数设置为 str 中数值后的下一个字符。
此函数的参数和使用方法,网上大部分资料都有介绍。但对此函数的返回值介绍的不够全面,大多数资料只提到了两种返回结果:
- 当输入nptr为非浮点字符串时,会返回0.0.
- 返回正常浮点数。
但实际上是还有第三种返回结果的,在此我补充一个踏过的坑:
- 当传入
nptr
的字符串为-Inf
或者Nan
时(不区分大小写),strtod返回的值不为0,而是inf
或者nan
- inf:这个值表示“无穷大 (infinity 的缩写)”,即超出了计算机可以表示的浮点数的最大范围(或者说超过了 double 类型的最大值)。
- nan:"nan"是 not a number 的缩写,这个的情况更复杂,一般来说,它们来自于任何未定义结果(非法)的浮点数运算。
- PS: 建议查找对应函数声明还是以英文官网为主,不然会被坑的很惨。。。此函数的详细说明见strtod
代码示例如下
测试代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<errno.h>
char *string1 = "-iNf";
char *string2 = "inF+";
char *string3 = "+Inf";
char *string4 = "sfsasd-";
char *string5 = "qwer1.23456";
char *string6 = "+1.23456Nananan";
char *string7 = "nan";
char *string8 = "NULL";
void test_strtod(char *string )
{
errno = 0;
double data = -1.0 ;
char *end_ptr=NULL;
printf("Origin data %lf \n",data);
printf("[%s] get string %s \n", string , string);
data = strtod(string , &end_ptr);
if( __isnan(data) )
printf("get data Nan \n");
else if( __isinf(data) )
printf("get data Inf \n");
else
printf("[%s] cover data %lf \n", string , data);
if(errno != 0)
printf("errno %s \n", strerror(errno));
printf("\n");
}
int main(int argc , char *argv[])
{
test_strtod(string1);
test_strtod(string2);
test_strtod(string3);
test_strtod(string4);
test_strtod(string5);
test_strtod(string6);
test_strtod(string7);
test_strtod(string8);
return 0;
}