我正在从一个包含数字(有些是整型和双精度型)并用',‘分隔的文件中读取数据。示例: 12.2,55.9,12.5我使用strtok()分隔每个数字,并保存一个指针。(我使用'c‘而不是c++)。
char * num1 = "12.2";
char * num2 = "55.9";
char * num2 = "12.5";
我想将每个数字存储在它自己的双变量中。
我累了:
double numD1 = atof(num1);
double numD1 = double(num1);
发布于 2014-10-15 15:40:54
编辑了以增加调用errno == ERANGE;
的价值,如下图所示
首先,在你的帖子中,你表示你尝试过:
char * num1 = "12.2";
double numD1 = atof(num1);
这应该是可行的。
最简单的方法是:(正如您已经尝试过的)
double x = atof("12.2");
atof()-将字符串的初始部分转换为双精度表示。
更好的方法是:
double x = strtod("12.3", &ptr);
C库函数
double strtod(const char *str, char **endptr)
将参数str
指向的字符串转换为浮点数(类型为double
)。如果endptr
不是NULL
,则指向转换中使用的最后一个字符之后的字符的指针将存储在endptr
引用的位置。如果由于正确的值超出了可表示值的范围,strtod()
无法转换字符串,则它会将errno
设置为ERANGE
(在errno.h
中定义)。
下面是一个使用具有两个输入的strtod();
的示例:(还说明了errno
的用法)
#include <errno.h>
int main ()
{
char input[] = "10.0 5.0";
char bad1[] = "0.3e500";
char bad2[] = "test";
char *ptr;
double a, b, c;
errno = 0;
a = strtod (input,&ptr);
if(errno != ERANGE)
{
errno = 0;
b = strtod (ptr,0);
if(errno != ERANGE)
{
printf ("a: %*.2lf\nb: %*.2lf\nQuotient = %*.2lf\n", 12, a, 12, b, 3, a/b);
}else printf("errno is %d\n", errno);
} else printf("errno is %d\n", errno);
//bad numeric input
errno = 0;
c = strtod (bad1, &ptr);
if(errno != ERANGE)
{
printf ("Output= %.2lf\n", c);
} else printf("errno is %d\n", errno);
//text input
errno = 0;
c = strtod (bad2, &ptr);
if(ptr != bad2)
{
printf ("Output= %.2lf\n", c);
} else printf("invalid non-numeric input: \"%s\" \n", ptr);
getchar();
return 0;
}
发布于 2014-10-15 15:43:29
为了使atof
正常工作,您需要包含头文件stdlib.h
。
https://stackoverflow.com/questions/26386506
复制相似问题