【问题标题】:atof() is not taking entire value in symbianatof() 在 symbian 中没有获取全部价值
【发布时间】:2012-08-07 09:40:06
【问题描述】:

当我尝试将 char 转换为 float 时,我正在使用 atof,但它没有返回整个值,&如何纠正这个问题 还有其他方法可以做到这一点吗?

如果我给出这个长度的值(700.898)它返回正确的值。如果我给出的数字超过 3 个,那么只会遇到问题。如果我问错了什么,对不起。

float flt = 71237.898;
char myfloat[50];
sprintf (myfloat, "%f", flt);  //myfloat = 71 237.8984380
float f = atof(myfloat); //f = 71.0000

删除空格:

int myfllen = strlen(myfloat);
    for(int b=0;b<strlen(myfloat);b++)
        {
        if(myfloat[b] == ' ')
            {
            int c = b;
            while(c<=myfllen)
                {
                myfloat[c] = myfloat[c+1]; 
                c++;
                }
            }
        }

【问题讨论】:

  • 你可以发布你遇到问题的案例吗?
  • 他确实发布了案例......代码是他发现问题的原因
  • @Mr.32:在大多数 cpu 架构/ABI 上,浮点和整数返回值在不同的寄存器中传输。因此,这不是重新解释值的问题,而是当atof 使用此输入完成时,整数返回值寄存器中最终会发生什么。
  • @20120:你真的运行过代码吗?如果你这样做了,那么你在sprintf产生的字符串中真的有那个空格吗?
  • @20120: 好的,那么你可以尝试包括&lt;locale.h&gt; 并按照我之前的建议执行setlocale 吗?我只是好奇它是否会有所帮助......

标签: c char symbian printf


【解决方案1】:

你真的在sprintf 之后在71237 之间有那个空间吗,正如你在 cmets 中发布的那样?如果是这样,那么这很可能是导致atof71 之后停止解析字符串的原因。您实际上可以切换到strtod(总是比atof 更好的主意)并要求它为您提供导致它停止解析的字符位置。

显然您的语言环境设置使sprintf 使用空格作为数字组分隔符。同时atof 不支持区域设置。语言规范不要求 atof (strtod) 识别除 "C" 区域设置之外的区域设置特定于区域设置的数字格式。

sprintf 之前执行setlocale(LC_ALL, "C"),它应该有望摆脱那个空间。或者手动清理这些空间。

【讨论】:

  • 猜测 sprintf 可能会这样做?否则不知道
  • 是的,这是正确的,但我没有在该值中给出任何空格。如何使用 sprintf 避免空格??
  • @20120:正如我上面所说,在执行sprintf 之前切换到"C" 语言环境。 C 程序实际上应该以"C" 语言环境启动。是否有人故意更改程序中的当前语言环境设置?如果是这样,您可能必须保存并恢复原始语言环境。
  • sprintf 的输出中不允许使用千位分隔符,无论区域设置如何,除非使用特殊格式说明符来请求它。这个sprintf 实现非常危险。
  • 在碳化物 c 中,我认为我不能使用 LC_ALL 获得未定义的标识符 LC_ALL。除了手动删除空格之外别无选择。
【解决方案2】:

我已经使用了你的代码并制作了小程序

#include<stdio.h>
#include<stdlib.h>
int main()
{
double flt = 71237.898;
char myfloat[50];
sprintf (myfloat, "%f", flt);  
double f = atof(myfloat); 
printf("answer is %f",f);
return 0;
}

输出

answer is 71237.898000

http://codepad.org/GMWScwqK

我认为你会因为使用 float 作为返回值而遇到问题......但实际上 atof 返回双值......

【讨论】:

  • 不,这不是问题所在。 atof() 返回的 double 值将隐式转换为 float,并将保持相同的值(精度有所损失)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多