c - K&R 4.2 书中的 atof()

标签 c atof

<分区>

我正在练习 K&R 书 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;
}

最佳答案

看来您没有很好地理解码合赋值运算符。

这是您的代码中的错误:

n+=n*10.0+s[i]-'0';
 ^^

注意是+=,add-and-assign。根据代码,我推断这不是您打算做的。您应该改为将其更改为常规赋值运算符:

n = n*10.0+s[i]-'0';
  ^

结果是正确的。

对于您代码中注释中的其他问题:

// Why there is no need to set sign as a double?

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

关于c - K&R 4.2 书中的 atof(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48088013/

相关文章:

c - 套接字收到的字节数少于发送的字节数

c - 如何像 ghostscript 一样将 X11 键盘事件路由到标准输入?

python - 创建 'generic' 类继承外部模块类的最佳方法

c - 如何从多线程并行的函数中获取一个正确的值

c - 如何将命令行参数读入 C 中的双数组/vector ?

c++ - atof 随机无法正常工作

C++使用atof将字符串转换为double

c - While循环导致程序崩溃

c++ - 为什么在使用 sscanf_s 或 atof 将 char * 转换为 float 时会出现精度损失?

Android FFmpeg : Undefined references to atof, log2 & log2f