自定义power函数后char*转double函数陷入无限循环求助
问题排查与修复方案
我帮你找到了核心问题,还有几个影响功能的小bug,逐一说明:
1. 无限循环的根源:power()函数无法处理负指数
你的power()函数现在只支持非负的指数,但在change()处理小数部分时,传入的是负指数(比如i=-1、-2...)。看这段循环逻辑:
while (exp != 0) { result=result*base; exp--; }
当exp是负数时,exp--会让它变得越来越小(比如-1→-2→-3...),永远不可能等于0,直接导致程序陷入无限循环,自然没有输出。
修复后的power()函数
我们需要让它支持负指数,同时把返回类型改成double(因为负指数会产生小数,用int会丢失精度):
double power(int base, int exp) { double result = 1.0; if (exp == 0) { return 1.0; } // 标记是否为负指数,同时将指数转为正数计算 int is_negative = 0; if (exp < 0) { is_negative = 1; exp = -exp; } while (exp != 0) { result *= base; exp--; } // 负指数返回结果的倒数 return is_negative ? 1.0 / result : result; }
2. change()函数的其他功能bug
除了无限循环,你的change()还有两个逻辑错误,会导致转换结果不正确:
- 整数部分赋值错误:你用
num1 = ...直接覆盖,而不是累加,比如转换"123"时,最后num1会变成100而不是123,需要改成num1 += ... - 小数部分赋值错误:同样是覆盖而不是累加,比如"1.23"会得到0.03而不是0.23,也要改成
num2 += ... - 多余的小数点查找循环:第二个
while (*Point != '.' && *Point)是重复操作,会导致指针位置混乱,直接删掉即可
修复后的change()函数
double change(char* Point) { int count = 0; double res = 0; // 跳过开头的无效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); } double num2 = 0; // 如果没有小数点,直接返回整数部分 if (*Point != '.') { return (double)num1 + num2; } Point++; // 跳过小数点 int i = -1; // 计算小数部分的值(累加) while (*Point) { num2 += (double)(*Point - '0') * power(10, i); i--; Point++; } res = (double)num1 + num2; return res; }
测试验证
修改后测试你提到的场景:
change("5.5")→ 返回5.5change("0.0")→ 返回0.0change("50")→ 返回50.0change("1.5")→ 返回1.5change("123.45")→ 返回123.45
内容的提问来源于stack exchange,提问作者kasandra
相关产品推荐
相关产品推荐

