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?

你当然可以这样做,而且你不会观察到结果有任何差异,所以不需要这样做(不是你可以不要这样做)。它只是不向代码添加任何内容。