K&R 4.2 书中的 atof()
atof() in K&R book 4.2
我正在锻炼 atof()
,这是 K&R 书 4.2 中提供的。但是,当我编译以下代码时,我得到
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;
}
看来你对组合赋值运算符的理解不是很好。
这是您的代码中的错误:
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?
你当然可以这样做,而且你不会观察到结果有任何差异,所以不需要这样做(不是你可以不要这样做)。它只是不向代码添加任何内容。
我正在锻炼 atof()
,这是 K&R 书 4.2 中提供的。但是,当我编译以下代码时,我得到
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;
}
看来你对组合赋值运算符的理解不是很好。
这是您的代码中的错误:
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?
你当然可以这样做,而且你不会观察到结果有任何差异,所以不需要这样做(不是你可以不要这样做)。它只是不向代码添加任何内容。