2016-03-15 59 views
0

我需要将字符串(如“3.456”)转换为不带atof()或任何其他字符串操作函数的float类型。下面是我的代码,它适用于c字符串到int的转换,但显然由于句点而不能用于float。我需要添加什么来处理这段时间?谢谢。C字符串浮点转换

#include <stdio.h> 

int size; 
char string[] = "345"; 
int result = 0; 
int i = 0; 

int findLength(char string[]){ 

for(size = 0; string[size]!='\0'; size++){ 

} 
return size; 
}; 

void conversion(char string[]){ 

result = result * 10 + (string[i] - '0'); 
if (i < size - 1) { 
i++; 
conversion(string); 
} 
} 

int main(int argc, const char * argv[]) { 
findLength(string); 
conversion(string); 
printf("%d\n", result); 
return 0; 
} 
+1

正确执行此操作需要几千行代码。 –

+0

大量关于interwebs的例子,例如[atof.c](http://www.opensource.apple.com/source/python/python-3/python/Python/atof.c) –

+0

我会用char-by-char状态机。也许这只是我.. :) –

回答

0

别的之前,我想对你了解这一点很重要如何浮点数工作,以及它们是如何表示的,至少在C在此question/reply寻找更多的信息。

现在回到你的问题。由于float在内存中的表示方式,您可能无法获得确切的转换。也就是说,您可能无法将“3.456”完全转换为保存值3.456的浮点数。你只能接近你想要的确切值。

一两件事情你的代码错误:

  • 我就从我的代码,除非必要使用全局变量望而却步。您将“大小”定义为全局变量,这不是一个好习惯。
  • 使用标准库strlen函数获取字符串的长度,而不是重写这样做的函数。

下面,你会发现一个工作解决方案。做转换的方法是如下:

  • 扫描通过字符串得到小数点
  • 的位置。如果遇到非点字符,把它添加到结果
  • 当你通过字符串扫描完成后,您需要考虑小数点前的数字的强弱。例如,小数点前的第一位数字只是简单地添加到结果中。小数点前的第二位数字乘以10.0并添加到结果中,依此类推。这是通过一个简单的while循环完成的,如代码所示。
#include <stdio.h> 
#include <string.h> 
float stringToFloat(char *string) 
{ 
    float result= 0.0; 
    int len = strlen(string); 
    int dotPosition = 0; 

    for (int i = 0; i < len; i++) 
    { 
     if (string[i] == '.') 
     { 
      dotPosition = len - i - 1; 
     } 
     else 
     { 
      result = result * 10.0 + (string[i]-'0'); 
     } 
     } 

     while (dotPosition--) 
     { 
     result /= 10.0; 
     } 

    return result; 
} 

int main() 
{ 
    char string[] = "3.456"; 

    printf("%f\n",stringToFloat(string)); 
} 

我希望这有助于。

P.S:您可以通过使用double而不是float来提高精度。

+0

您的回复非常有帮助谢谢! –

+0

这可以起作用,因为你不关心如何获得所谓的“正确舍入”结果。例如,对于“1234.56”,正确答案是1234.56005859375(如果您打印所有数字),即十六进制数为0x1.34a3d8p10。您的代码返回1234.5599365234375,或十六进制0x1.34a3d6p + 10;这是一个“最后一个单位”,低于正确的值。 (另外,你可能需要在文字后面加上'f'后缀,所以你的中间值是浮动值,而不是双倍值。) –