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

来源:互联网 发布:淘宝男鞋店铺哪家好 编辑:程序博客网 时间:2024/05/17 02:48

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

原创粉丝点击