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是判断不出错误的。
假设 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是判断不出错误的。
相关文章推荐
- 自己动手写C语言浮点数转换字符串函数
- 将C语言的char字符串转换为NSString的问题
- C++ 字符串转换为浮点数时的精度问题
- 计算机进制问题---浮点数转换为二进制数
- iOS中 OC字符串 与 C语言字符串 相互转换
- C语言的字符串倒置问题
- 字符串到字节数组和字节数组到字符串的转换(编码和解码问题)
- C语言字符串转换成日期
- 把流中的字符串转换为 UTF 格式 - 回复 "lostapple" 的问题
- C语言中的无符号数与有符号数混合运算时隐含转换问题
- 【C语言】编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- C语言atoi()函数:将字符串转换成int(整数)
- C语言中char int转换问题
- C语言中char int转换问题
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- 字符串转换成整数,通配符的字符串匹配问题
- 将一个十六进制字符串转换为十进制数值的问题
- 字符串转换为无符号整数(unsigned int)的问题
- C语言实现 递归法 数字转换成字符串
- 字符串转换成浮点数的方法