【问题标题】:Converting string to float in C?在C中将字符串转换为浮点数?
【发布时间】:2015-01-16 14:55:11
【问题描述】:

是的,所以在我的 C 程序中,我有一个从文件中获取浮点值的函数,在这里我试图做相反的事情,获取字符串并将其转换为浮点数。

 float PsSc = atoi(stock01[DataCount].defPsSc);

我知道我的错误,我认为它适用于整数和浮点数,但事实并非如此。

我试过了

 float PsSc = atof(stock01[DataCount].defPsSc);

这也不起作用。

所以,我的问题是:我可以用什么替换我当前的代码行以使其正常工作?

输入:1.45。预期输出:1.45,实际输出:1.00

编辑:

 printf("\nYour previous speed was : %.2f Metres per Second",PsSc);

【问题讨论】:

  • 你是怎么断定输出是1.00你是怎么打印出来的?
  • 你在使用printf("%f...吗?
  • 显示所有相关代码。
  • atof 返回double 类型。
  • “它也不起作用”是什么意思

标签: c string file structure


【解决方案1】:

为什么我们不应该使用 atof

成功时,atof() 函数将转换后的浮点数作为双精度值返回。如果无法执行有效转换,则函数返回零 (0.0)。如果转换后的值超出可表示值的范围,则会导致 未定义的行为

相反,我们应该使用strtod() 中的<stdlib.h>

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char s[] = "1.45";
    printf("Float value : %4.2f\n",strtod(s,NULL));
    return 0;
}

它将正确打印 1.45

在此处查看插图http://ideone.com/poalgY

【讨论】:

  • 所以在这种情况下我写 printf("Value: %.2f",strtod(stock01[DataCount].defPsSc ,NULL));?
  • 我猜是因为我们不知道stock01[DataCount].defPsSc是什么
  • 您提出了一个冗长的观点,即更喜欢strtod 而不是atof,然后展示一个示例,您使用strtod 与使用atof 完全相同。
  • @ThatBlueJuice:是的,如果业力对我们有利,它应该可以工作。
  • @Shan:我没有投反对票。我刚刚发表了评论,您的示例并没有真正宣传您不应该使用atof 的断言。 (我认为在目前的形式下,atof 只是像你那样调用strtod。我的 Linux 联机帮助页说:“(atof(p) 的)行为与 strtod(p, NULL) 相同,只是 atof() 没有检测到错误")
【解决方案2】:

strtod() 函数系列正是您所寻找的。​​p>

strtod() 不仅会将输入字符串转换为doublestrtof() 用于floatstrtold() 用于long double),它还会告诉您它在哪里停止 em> 解析输入字符串(通过第二个参数)。

请注意,strtod()atof() 期望小数点还是小数点逗号...

#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <errno.h>

#include <stdio.h>

int main()
{
    // play with "." vs. "," to see why this might be your problem
    char * input = "1.45";

    // will take a pointer beyond the last character parsed
    char * end_ptr;

    // strto...() might give an error
    errno = 0;

    // convert
    float result = strtof( input, &end_ptr );

    if ( errno == ERANGE )
    {
        // handle out-of-range error - result will be HUGE_VALF
        puts( "out of range" );
    }

    if ( end_ptr != ( input + strlen( input ) ) )
    {
        // handle incomplete parse
        printf( "Unparsed: '%s'\n", end_ptr );
    }

    printf( "result: %.2f\n", result );
    return 0;
}

【讨论】:

  • 浮点 PsSc = strtod(stock01[DataCount].defPsSc); ?
  • @ThatBlueJuice:因为我确实知道stock01[DataCount].defPsSc实际上是什么(你没有在你的问题中向我们提供这些信息 - 你的input 可能已经被窃听了...),我不知道。此外,我恳请您在使用函数之前阅读文档,因为那会告诉您该函数需要两个参数。
  • stock01[DataCount].defPsSc 是一个字符串。
  • @ThatBlueJuice:就是这么说的。检查你的假设。如果它实际上是一个包含“1.45”的字符串,那么您的atof() 应该已经工作了。顺便说一句,您的语言环境设置是什么?您可能正在查看小数点与小数逗号问题。
【解决方案3】:

尝试使用更具体的sscanf

参考:http://www.cplusplus.com/reference/cstdio/sscanf/

float PsSc;

sscanf(stock01[DataCount].defPsSc, "%f", &PsSc);

例如:http://ideone.com/BaPmDj

#include <stdio.h>

int main(void) {
    char * str = "1.45";

    float flt;

    sscanf(str, "%f", &flt);

    printf("value = %f\n", flt);

    return 0;
}

【讨论】:

  • sscanf() 肯定比直接调用atof()“更具体”。
  • 我的意思是你可以指定你喜欢的任何类型。
  • 那肯定会比“更具体”更“通用”吗? :)
猜你喜欢
  • 2012-06-27
  • 1970-01-01
  • 2011-11-25
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
相关资源
最近更新 更多