char*c=";12.3“;我如何将12.3存储到双变量中

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

我从一个有数字(一些int和double)并用“,”分隔的文件中读取数据。 示例:12.2,55.9,12.5 我使用strtok()分隔每个数字,并将其保存为指针。 (我使用的是“c”而不是c++)

我想将每个数字存储在它自己的双变量中

我累了:

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;
}