在C语言的标准库中,提供了atof,strtod等将字符串转换为double类型的函数。
假设 char *str为一个需要转换的字串,则我们可以这样使用:
double dval;
dval = atof(str);
dval = strtod(str, 0);
我们还可以使用 sscanf来进行装换:
sscanf(str, “%lf”, &dval);
但是,在上面的转换中,我们忽略了一个问题:怎样判断是否转换成功?这里我给出了一个解决方法。
这里的程序代码包括两个文件:str2double.h及 strdouble.c,可以将这个实用函数添加到实用函数库里。
str2double.h
# ifndef str2double_h
# define str2double_h
# ifdef hpux
# define str2double(str) strtod(str, 0);
# else
extern double str2double(cons char *str);
# endif
# endif /* end of <ifndef str2double_h> */
str2double.c
# ifndef hpux
# include “str2double.h”
# include <math.h>
# include <errno.h>
double str2double(const char *str)
{
double rval; /* return value */
char *p;
rval = strtod(str, &p);
if ( str == p ) /* convertion failed */
errno = EINVAL;
else if ( isnan(rval) || isinf(rval) )
errno = ERANGE;
return rval;
}
# endif /* end of <ifndef hpux> */
这里,以HP UNIX 的strtod的实现为标准,写了str2double的函数。具体的可以这样使用:
# include “str2double.h”
errno = 0;
dval = str2double(str);
if ( errno != 0 )
{
转换失败;
}
事前errno的清零是必须的,否则,它的值有可能是前面的调用带来的值。
有人说,使用sscanf也可以判断转换结果:
if ( sscanf(str, “%lf”, &dval) != 1 )
{
转换失败;
}
但对于出界的转换 (isnan, isinf), sscanf是判断不出错误的。