我写了Num
来帮助我将字符串转换为change()
。
例如:如果字符串是" 5.5",我希望数字为5.5。如果字符串是" 0.0",我希望数字为0.另一个例子:" 50"到50岁。
现在的问题是当我在库math.h中使用double
和change()
时,一切都运行得很好,我用很多输入测试它,一切都很完美。< / 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;
}
答案 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。