将字符串转换为float而不使用c中的内置函数

时间:2011-08-17 13:20:31

标签: objective-c c

我不知道如何将字符串值转换为double或float。以下是我要转换的示例字符串:"3.45667"。我正在努力处理这个点。

我尝试了这个但是没有用:

#include<stdio.h>

int main()
{
    char string_array[] = { "3.45667" };
    float float_array[20], index = 0;

    for(index = 0 ; index < 7 ; index++)
    {
        if(string_array[index] == '.')
        {
            printf("dot");
            // here, how to add dot to the float_array?
        } else
        {
            float_array = (float)(string_array[index] - '0');
        }
    }
    return 0;
}

如何在上面的代码中添加小数点?我认为这可以用指数形式完成,但我不知道如何使用指数形式。

5 个答案:

答案 0 :(得分:2)

这是一个算法..

  1. 找到.
  2. 获取该点的子字符串并转换为整数(遍历字符,转换为int - 应该是一个简单的问题)
  3. 对所有内容做同样的事情,同时跟踪“小数”组件中的位数。
  4. 将“小数”分量除以10的位数,然后将其添加到积分分量。
  5. 编辑:如果没有使用C函数,并且给出了c ++标记,我会选择..

    std::istringstream foo("3.141");
    double v;
    foo >> v;
    

    看不见C功能! ;)

答案 1 :(得分:0)

当你去求它们时,使用字符串中小数点的位置来按比例因子10缩放数字...所以小数点左边的第n项缩放10 ^(n- 1)并且右边的第m个项目按(0.1)^ m缩放。所以......

 for each char in thestr do
    if it's a digit then
       Add the digit to the list
    else then
       dp = position - 1

 sum = 0
 for each digit in list
    sum = sum + digit * pow(10, dp - position)

 return sum

答案 2 :(得分:0)

int num = 0;

// parse the numbers before the dot
while(*string != '.')
  num += 10*num + *string++ - '0';

string++;
float frac = 0.0f;
float div = 1.0f;

// parse the numbers after the dot
while(*string != '\0') {
  frac += (*string++ - '0')/div;
  div /= 10.0f;
}

float res = num + frac;

或类似的东西......很可能是它中的一些错误..

答案 3 :(得分:0)

以下程序只计算小数点后面的位数,并在最后对结果进行缩放,而不是每个数字。

float result = 0.0;
float scale  = 0.0;

char *s = "3.14567":

while (*s) {
     if (*s >= '0' && *s <= '9') {
        result = 10.0 * result + (float)(*s - '0');
        scale *= 10.0;
     }
     else if (*s == '.') scale = 1.0;
     else  { /* ERROR HANDLING */ }
     s++;
}
result = result / (scale == 0.0 ? 1.0 : scale)

答案 4 :(得分:0)

这有点紧迫:

#include <ctype.h>

double _atof(char *s)
{
        double a = 0.0;
        int e = 0;
        int c;
        while ((c = *s++) != '\0' && isdigit(c)) {
                a = a*10.0 + (c - '0');
        }
        if (c == '.') {
                while ((c = *s++) != '\0' && isdigit(c)) {
                        a = a*10.0 + (c - '0');
                        e = e-1;
                }
        }
        if (c == 'e' || c == 'E') {
                int sign = 1;
                int i = 0;
                c = *s++;
                if (c == '+')
                        c = *s++;
                else if (c == '-') {
                        c = *s++;
                        sign = -1;
                }
                while (isdigit(c)) {
                        i = i*10 + (c - '0');
                        c = *s++;
                }
                e += i*sign;
        }
        while (e > 0) {
                a *= 10.0;
                e--;
        }
        while (e < 0) {
                a *= 0.1;
                e++;
        }
        return a;
}

你将有一个双倍,然后你需要转换或转换为浮动。