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

How to convert a char* to a number function with a comma (decimal point)?

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

例如:如果字符串是“5.5”,我希望数字是5.5。如果字符串是“0.0”,我希望数字是0。另一个例子:“50”到50。

现在的问题是,当我将 change() 与库 math.h 中的 pow() 一起使用时,一切正常,我用大量的输入和所有内容对其进行了测试工作完美。

测试示例:

change("5.0") 给我 5
change("1.5") 给我 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;
}

我也写了函数power:

int power(int base,int exp)
{
    int result=1;
    if(exp == 0){
        return 1;
    }
    while (exp != 0)
    {
        result=result*base;
        exp--;
    }
    return result;
}

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

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

编辑:您还必须将幂函数更改为 return double 而不是 int

您可以使用 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

正如已经确定的那样,问题是如果 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';
}

我还用 isdigit(*Point) 替换了 *Point != '.' && *Point(来自 "ctype.h"),因为这样可以确保如果它遇到不是数字字符的东西,它不会尝试把它变成一个数字 - 你应该在那个时候完全停止处理。

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