C语言中字符串转换浮点数的问题

在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是判断不出错误的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值