您的位置:首页 > 编程语言 > C语言/C++

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

2009-07-15 20:11 369 查看
在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是判断不出错误的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: