char*c=";12.3“;我如何将12.3存储到双变量中
我从一个有数字(一些int和double)并用“,”分隔的文件中读取数据。 示例:12.2,55.9,12.5 我使用strtok()分隔每个数字,并将其保存为指针。 (我使用的是“c”而不是c++) 我想将每个数字存储在它自己的双变量中 我累了:char*c=";12.3“;我如何将12.3存储到双变量中,c,pointers,char,double,C,Pointers,Char,Double,我从一个有数字(一些int和double)并用“,”分隔的文件中读取数据。 示例:12.2,55.9,12.5 我使用strtok()分隔每个数字,并将其保存为指针。 (我使用的是“c”而不是c++) 我想将每个数字存储在它自己的双变量中 我累了: double numD1 = atof(num1); double numD1 = double(num1); 编辑以添加调用errno==ERANGE的值,请参见下面的说明 首先,在您的帖子中,您表示您尝试了: char * num1 = &qu
double numD1 = atof(num1);
double numD1 = double(num1);
编辑以添加调用errno==ERANGE的值代码>,请参见下面的说明
首先,在您的帖子中,您表示您尝试了:
char * num1 = "12.2";
double numD1 = atof(num1);
这本应该奏效的
最简单的方法是:(正如您已经尝试过的)
double x=atof(“12.2”)代码>
-将字符串的初始部分转换为双精度表示
最好是:
:
C库函数double strod(const char*str,char**endptr)
将参数str
指向的字符串转换为浮点
编号(键入double
)。如果endptr
不是NULL
,则指向
转换中使用的最后一个字符后的字符存储在
endptr
引用的位置。如果strtod()
无法转换字符串,因为正确的值超出了可表示值的范围,则它会将errno
设置为ERANGE
(在errno.h
中定义)
下面是一个使用strtod()的示例代码>有两个输入:(还说明了errno
的使用)
#包括
int main()
{
字符输入[]=“10.0 5.0”;
char bad1[]=“0.3e500”;
字符bad2[]=“测试”;
char*ptr;
双a、b、c;
errno=0;
a=strtod(输入和ptr);
if(errno!=ERANGE)
{
errno=0;
b=strtod(ptr,0);
if(errno!=ERANGE)
{
printf(“a:%*.2lf\nb:%*.2lf\n通知=%*.2lf\n”,12,a,12,b,3,a/b);
}else printf(“errno是%d\n”,errno);
}else printf(“errno是%d\n”,errno);
//错误的数字输入
errno=0;
c=标准偏差(bad1和ptr);
if(errno!=ERANGE)
{
printf(“输出=%.2lf\n”,c);
}else printf(“errno是%d\n”,errno);
//文本输入
errno=0;
c=标准偏差(bad2和ptr);
如果(ptr!=bad2)
{
printf(“输出=%.2lf\n”,c);
}else printf(“无效的非数字输入:\%s\”\n,ptr);
getchar();
返回0;
}
要使atof
正常工作,您需要包含头文件stdlib.h
您在尝试它们时得到了什么?可能重复-请发布一个问题以便我们能够回答…同意strtod()
优于atof()
。演示如何使用ptr
和errno
将改进答案。@chux-谢谢。添加了说明errno使用的注释和代码。注释:1)应在strtod()之前设置errno=0
,因为函数在成功时未设置errno=0
。对于当前代码,如果a
或b
转换设置errno
,c
也会出现错误。2) 如果input==endptr
,则不会发生转换,strod()
返回0.0
。当然,这是一个值得发出错误消息的问题。3) 如果strtod()
下溢,它将返回一个关于+/-0.0
或“+/-最小规范化正数”的值,并可能设置errno=ERANGE
。4) 考虑到strtod()的健壮使用的复杂性,建议使用helper函数。这更好,但并不容易+1.anyways@chux-我开始编辑答案以回应您的评论(顺便说一句,评论很好),但随后注意到OP的目的。(见下面帖子中的评论)然后想,为什么要走得更远?然而,我确实找到了关于errno的大部分信息,但也证实了您的观察,即strod()
是健壮的。(我能想到其他一些事情)@Ryker同意——“这个有趣的观点”的说法。也同意“为什么要走得更远?”。strtod()、strtol()、…
的关键在于它们是字符串到数字转换器的构建块。我发现它们很有用,但很少单独使用。我找到了另一种方法,它对我有效。1)我做了一个:双x;然后我使用:“C是指针”sscanf(C、%lf、&x);然后我打印f(“X是%lf\n”,X);非常感谢。
char * num1 = "12.2";
double numD1 = atof(num1);
double x = strtod("12.3", &ptr);
#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;
}