C字符串到浮动转换

时间:2016-03-15 17:24:50

标签: c string floating-point

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

#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 :(得分:0)

在此之前,我认为了解浮点数如何工作以及如何表示它们非常重要,至少在C中。请查看此question/reply以获取更多信息。

现在回到你的问题。由于浮点数在内存中的表示方式,您可能无法获得精确的转换。那就是你可能无法转换&#34; 3.456&#34;到一个保持值为3.456的浮点数。您将只能接近您想要的确切值。

首先,您的代码有些问题:

  • 除非必要,否则我会远离在代码中使用全局变量。你定义了&#34; size&#34;作为一个全球变量,这不是一个好的做法。
  • 使用标准库 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来提高精度。