【问题标题】:char *c = "12.3" I how do I store 12.3 into a double variablechar *c = "12.3" 我如何将 12.3 存储到双变量中
【发布时间】:2014-10-15 15:36:46
【问题描述】:

我正在读取一个包含数字(一些 int 和 double)并用“,”分隔的文件。 示例: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);

【问题讨论】:

标签: c pointers char double


【解决方案1】:

已编辑以增加价值调用errno == ERANGE;,下面用于说明

首先,您在帖子中表示您尝试过:

char * num1 = "12.2";  
double numD1 = atof(num1); 

这应该有效。

最简单的方法是:(你已经试过了)

double x = atof("12.2");

atof()- 将字符串的初始部分转换为双精度表示。

更好的是:

double x = strtod("12.3", &ptr);

strtod():

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

【讨论】:

  • 同意strtod() 优于atof()。展示如何使用ptrerrno 可能会改进答案。
  • @chux - 谢谢。添加了说明 errno 使用的注释和代码。
  • 注:1) 应在strtod() 之前errno=0,因为该函数不会在成功时设置errno = 0。使用当前代码,如果ab 转换设置errnoc 也会出现错误。 2) 如果input==endptr,则没有发生转换,strtod() 返回0.0。当然是一个值得错误消息的问题。 3) 如果strtod() 下溢,它返回一个大约+/-0.0 或“+/- 最小归一化正数”的值,并且可能 设置errno = ERANGE。 4) 鉴于strtod() 的稳健使用的复杂性,建议转为辅助函数。它更好,但并不容易。 +1 反正
  • @chux - 我开始编辑答案以解决您的 cmets(顺便说一句非常好的评论),但随后注意到 OP 解决了什么问题。 (见下面帖子中的评论)并想,为什么要走得更远?但是,我确实发现 this interesting post 主要是关于 errno,但也证实了您的观察,即 strtod()robust。 (我可以想到其他一些事情)
  • @ryyker 同意 - “这个有趣的点”参考。也同意“为什么要走得更远?”。 strtod(), strtol(), ... 的关键在于它们是字符串到数字转换器的构建块。我发现它们很有用,但很少能独立使用。 strtol() example
【解决方案2】:

要使atof 正常工作,您需要包含头文件stdlib.h

【讨论】:

  • 我找到了另一种适合我的方式。 1)我做了一个:双x;然后我用:“C 是指针” sscanf(c,"%lf",&x);然后我 printf("X is %lf\n",x);谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 2021-01-24
  • 1970-01-01
  • 2021-04-13
  • 2021-03-26
  • 1970-01-01
  • 2020-05-10
相关资源
最近更新 更多