如何使用逗号(小数点)将char *转换为数字函数?

时间:2018-01-05 13:11:21

标签: c pow

我写了Num来帮助我将字符串转换为change()

例如:如果字符串是" 5.5",我希望数字为5.5。如果字符串是" 0.0",我希望数字为0.另一个例子:" 50"到50岁。

现在的问题是当我在库math.h中使用doublechange()时,一切都运行得很好,我用很多输入测试它,一切都很完美。< / p>

测试示例:

pow()给了我5个 change("5.0")给了我1.5

由于我无法使用我编写的change("1.5")数学库,但是当我测试power()时,现在我没有得到输出。我认为它陷入无限循环。

为什么会发生这件事有什么帮助?

change()

我还写了功能:

double change(char* Point) {
    int count = 0;
    double res = 0;
    while (*Point == '0') {
        Point++;
    }
    while (*Point != '.' && *Point) {
        count++;
        Point++;
    }

    int num1 = 0;
    for (int i = 0; i < count; i++) {
        Point--;
        num1 = (*Point - '0') * (power(10, i));
    }

    int i = -1;
    while (*Point != '.' && *Point) {
        Point++;
    }
    double num2 = 0;
    if (!*Point) {
        return res = (double) num1 + num2;

    }
    Point++;
    while (*Point) {
        num2 = (double) (*Point - '0') * (double) (power(10, i));
        i--;
        Point++;
    }
    res = (double) num1 + num2;

    return res;
}

3 个答案:

答案 0 :(得分:0)

因为你在改变函数中调用函数power(10,i),而我有一个负值。您可以通过在幂函数中添加if语句来解决此问题

if (exp < 0) {
    exp = 0 - exp;
    return(1/power(base,exp));
}

编辑:您还必须更改power函数以返回double而不是int

答案 1 :(得分:0)

您可以使用atof()

将字符串转换为浮点数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {
   float val;
   char str[20];

   strcpy(str, "98993489");
   val = atof(str);
   printf("String value = %s, Float value = %f\n", str, val);


   return(0);

代码来源:https://www.tutorialspoint.com/c_standard_library/c_function_atof.htm

答案 2 :(得分:0)

如上所述,问题是如果exp函数中power小于0,此循环将永远不会结束。

while (exp != 0)
{
    result=result*base;
    exp--;
}

但是如果你解决了这个问题,你的代码仍然无效,因为你只在num1中存储了一位数

num1 = (*Point - '0') * (power(10, i));

如果你传球,例如,“50”它会工作正常,你会得到50回,但如果你传入“54”,你也会得到50,因为你失去了4。

您需要将新计算的数字添加到现有值中。

num1 += (*Point - '0') * (power(10, i));

您可以大大简化该函数的第一位并删除使用power的需要,但通过实现当您在字符串中移动时,您可以将num1的当前值加倍10然后添加新数字。这意味着您只需处理小数点前的字符串一次而不是3次。

int num1 = 0;
for(;isdigit(*Point);Point++) {
    num1 *= 10;
    num1 += *Point - '0';
}

我还将*Point != '.' && *Point替换为isdigit(*Point)(来自“ctype.h”),因为这样可以确保如果它遇到不是数字字符的内容,则不会尝试将其转换为到一个数字 - 你应该在那时完全停止处理。

您可以使用相同的想法计算power来完全取消对num2的需求,因为您划分的金额*Point - '0'每次也会增加10。