2010-02-03 140 views
1
#include <stdio.h> 
#include <stdlib.h> 

int main (void) 
{ 
double f; 

printf ("What is the temperature in Fahrenheit?\n"); 
scanf ("%d", &f); 

double x = (f-32)*(5/9); 
printf ("%d degrees Fahrenheit \n",f); 
printf ("%d degrees Celsius",x); 
system("PAUSE"); 

return 0; 
} 

f似乎是变量f的打印地址而不是值,它可能是一个语法错误。c变量似乎是打印地址而不是变量值

+0

请参阅* http://stackoverflow.com/questions/210590/why-does-scanf-need-lf-for-doubles-when-printf-is-okay-with-just-f*关于使用* * scanf()**和** printf()**双打 – jschmier 2010-02-03 16:15:18

+0

5/9 == 0; 5.0/9.0是你想使用的。 – 2010-02-03 16:26:38

回答

7

%d应为%F:

printf ("%f degrees Farenheit \n",f); 
printf ("%f degress Celsius",x); 

编辑:乔纳森指出的,你需要改变:

double x = (f-32)*(5/9); 

double x = (f-32)*(5.0/9); 

在C,整数除法(分红和除数都是整数类型的分部)截断,所以5/9总是0.

+1

将“%f”用于float和double;像printf这样的variadic 函数的float参数会自动提升为double。 – jschmier 2010-02-03 16:07:16

+0

+1。 %f应该这样做。 http://www.thinkage.ca/english/gcos/expl/c/lib/printf.html – codaddict 2010-02-03 16:10:09

+1

这是问题的一个主要部分 - 这不是全部问题。另一个问题是5/9 == 0问题。 – 2010-02-03 16:30:54

0

添加到其他人所说,%d代表“十进制”(而不是%x是“十六进制”)

浮点数,或在您的情况下双精度浮点数,使用%f

3

%d表示“十进制整数”。您正在使用double s,而不是int s。因此在printf()scanf()%f中使用%lf

2

尝试......

#include <stdio.h> 
//#include <stdlib.h> 

int main (void) 
{ 
float c; 
float f; 

printf ("What is the temperature in Fahrenheit?\n"); 
scanf ("%f", &f); 

c = (f-32)*(5.0/9.0); 
printf ("%f degrees Fahrenheit \n",f); 
printf ("%f degrees Celsius \n",c); 
system("PAUSE"); 

return 0; 
} 
+1

如果实际包含则更好 - 它声明'system()'。 – 2010-02-03 16:28:13

0

9次了10年,当您使用printf显示调试数据,发现其显示效果的bizzare,你有你的电话printf错误。

这就是为什么我现在试图避免printf。动态格式位是整齐的,但是调用的极端类型 - 不安全性使其经常成为错误的源头,而不是显而易见的。

+0

给自己一个编译器,告诉你什么时候犯错误 - 并且学习规则,这样你就不会犯错误。 – 2010-02-03 16:29:55

2

你的第一个问题是double x = (f-32)*(5/9)5/9为零,因为您正在使用整数除法,所以x对于所有输入将具有值0.0。对于浮点除法,使用浮点数(如5.0/9.0)。

二,%d用于打印整数。使用%f来打印浮点值。