atof()in K& R book 4.2

时间:2018-01-04 02:51:33

标签: c atof

我正在练习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;
}

1 个答案:

答案 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?

你当然可以这样做,你不会发现结果有任何差异,所以没有需要来做(不是你不能这样做)。它只是对代码没有任何补充。