#include <stdio.h>
#include <math.h>
double hypotenuse( double side1, double side2 );
int main( void )
{
double a, b;
printf( "Enter the values of the two sides: " );
scanf( "%f %f", &a, &b );
printf( "\nThe length of hypotenuse is: %f", hypotenuse( a, b ) );
getchar();
getchar();
return 0;
}
double hypotenuse( double side1, double side2 )
{
double c;
c = (side1 * side1) + (side2 * side2);
return sqrt( c );
}
当我使用float a, b;
代替double a,b;
时,上述程序有效。为什么呢?
答案 0 :(得分:4)
在您的代码中,您使用
scanf( "%f %f", &a, &b );
但%f
用于float
,而不是double
。试试%lf
。{/ p> double
答案 1 :(得分:1)
对于scanf()
,说明符"%f"
需要float *
参数,而不是double *
。
double a;
// v--- &a is type double *, scanf("%f" expects float *
scanf( "%f", &a );
要在double
中进行扫描,请使用需要"%lf"
参数的说明符double *
。
double a;
// v--- &a is type double *
scanf( "%lf", &a );
详细信息:scanf()
的参数是地址,其中scanf()
可以存储结果。 float *
与double *
不同。
使用printf()
,数字参数是要打印的值。由于printf()
采用可变数量的参数,因此它们会通过常规促销活动,例如float
到double
。因此printf("%f", some_float)
和printf("%f", some_double)
可以使用相同的格式说明符。 常规促销不适用于&a
,&b
scanf()
,因为这些参数是指针(地址),而不是算术值。
注意:一定要检查scanf()
结果。不需要"%lf"
和"%lf"
之间的空格,因为"%lf"
本身会消耗领先的空白区域,但通常在视觉上更容易理解。
if (2 != scanf( "%lf%lf", &a, &b )) Handle_Error();