我在K&R中玩一些代码只是为了好玩,但是遇到了一个我无法解释的错误。我正在修改第1.2节第9页的代码,即温度转换程序:

#include <stdio.h>
/* converts a range of fahrenheit temperatures to celsius
and displays them in a table*/

int main(int argc, char *argv[]){
  float fahr, celsius;
  float lower, upper, step;

  if(argc != 4){
    printf("Usage: ./tempConvert lower upper step\n");
    return 1;
  }

  // note: atof is bad?
  lower = atof(argv[1]);   // lower limit of temperature
  upper = atof(argv[2]);   // upper limit of temperature
  step  = atof(argv[3]);   // step size

  //printf("%f %f %f",lower, upper, step);

  fahr = lower;
  printf("F \t C \n");

  while(fahr <= upper){
    celsius = 5.0*(fahr-32.0)/9.0; // if this were int, 5/9=0 because int division
    printf("%3.1f \t %6.1f\n", fahr, celsius);
    fahr += step;
  }

  return 0;
}

当运行时,我得到一个无限循环。然而,当我将atof更改为atoi时,它工作得非常好,而不是我只需要浮点精度而不需要整数。输入值后立即打印出来也会产生垃圾,而不是我输入的数字。是什么导致了使用atoi和atof读入数字之间的差异?

最佳答案

您没有包含<stdlib.h>,所以编译器假定atof()返回int,但它没有。
您在编译时没有启用足够的警告!您应该坚持编译器在调用作用域中没有原型的函数时发出警告。注意,如果函数根本没有声明,C99模式会警告您,但它仍然允许非原型声明。
对于GCC,我经常使用这个(或-std=c11和其他选项):

gcc -g -O3 -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
    -Wold-style-definition -Wold-style-declaration -Werror ...

您的代码不会在这些选项下编译。

关于c - k&r示例,温度转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23924058/

10-10 15:18