我正在练习K& R book 4.2 中提供的atof()
。但是,当我编译以下代码时,我得到了
1952.690000
而不是
1237.88
我试过了,但还是不知道哪里错了。也许类型转换有问题?
#include <stdio.h>
#include <ctype.h>
double atof(char s[]) {
int i, sign;
double n, power;
for (i = 0; isspace(s[i]); ++i)
;
sign = (s[i] == '-') ? -1 : 1;
if (s[i] == '-' || s[i] == '+')
++i;
for (n = 0.0; isdigit(s[i]); ++i)
n += n * 10.0 + s[i] - '0';
if (s[i] == '.')
++i;
for (power = 1.0; isdigit(s[i]); ++i) {
n += n * 10.0 + s[i] - '0';
power *= 10.0;
}
return sign * n / power;
}
int main() {
char s[] = "1237.88";
printf("%lf", atof(s));
return 0;
}
答案 0 :(得分:2)
似乎你并没有很好地理解组合赋值算子。
以下是代码中的错误:
n+=n*10.0+s[i]-'0';
^^
注意它是+=
,添加并分配。根据代码,我推断出它不是你想要做的。您应该将其更改为常规赋值运算符:
n = n*10.0+s[i]-'0';
^
结果是正确的。
对于代码中的评论中的其他问题:
// Why there is no need to set sign as a double?
你当然可以这样做,你不会发现结果有任何差异,所以没有需要来做(不是你不能这样做)。它只是对代码没有任何补充。