Float读为double

时间:2013-09-13 06:37:43

标签: c floating-point floating-point-conversion

我的代码看起来像

#include <stdio.h>
#include <math.h>
int main (void)
{ 
float x1, x2, x3;
float y1, y2, y3;
float Cos0, i, j, k, innerProduct;
float Xlength, Ylength;
x1=0;
x2=0;
x3=0;
y1=0;
y2=0;
y3=0;
Cos0=0;
i=0;
j=0;
k=0;
innerProduct=0;
Xlength=0;
Ylength=0;

printf("Please insert six floating point numbers \n");

scanf("%f%f%f%f%f%f", x1, x2, x3, y1, y2, y3);

Xlength=sqrt((x1*x1)+(x2*x2)+(x3*x3));

Ylength=sqrt((y1*y1)+(y2*y2)+(y3*y3));

i=x1+y1;

j=x2+y2;

k=x3+y3;

innerProduct=((x1*y1)*(x2*y2)*(x3*y3));

Cos0=(innerProduct)/((Xlength*Ylength));

return 0;
}

我得到以下编译错误     “警告:格式%f需要类型'float *'的参数,但参数”x“的类型为double”

其中x是其中一个数字,这对于scanf命令中的所有6个参数都会发生,我已将所有变量指定为浮点数,并且它不喜欢它。

我该如何解决这个问题?谢谢!

2 个答案:

答案 0 :(得分:3)

scanf不起作用。您必须将指针传递给将保存输入的变量。

此外,在“模板”(第一个参数)中,占位符必须以某种方式分开 - 否则scanf将不知道如何拆分它得到的输入。

这将有效:

scanf ("%f %f %f %f %f %f", &x1, &x2, &x3, &y1, &y2, &y3);

有关更多信息,请阅读文档。例如,http://www.gnu.org/software/libc/manual/html_node/Formatted-Input-Functions.html说:

  

功能:int scanf(const char * template,...)

     

scanf函数在模板字符串模板的控制下从流stdin读取格式化输入。可选的   参数是指向接收结果的地方的指针   值。

注意“指针”部分。


另一个问题是:“为什么警告会抱怨double,而我传入了float”?这在comp.lang.c FAQ question 15.10

中得到了解答
  

问:我有一个varargs函数,它接受一个float参数。为什么   是不是va_arg(argp, float)正在工作?

     

答:在可变长度参数列表的可变长度部分中,   旧的“默认参数促销”适用:float类型的参数   始终提升(扩展)为double类型,并键入char和short int   被提升为int。因此,调用永远不正确   va_arg(argp,float);相反,你应该总是使用va_arg(argp,   双)。同样,使用va_arg(argp,int)来检索哪些参数   最初是char,short或int。 (出于类似的原因,最后一个   交给va_start的“固定”参数不应该是可扩展的,   或者。)另见问题11.3和15.2。

请注意,scanfvariadic function(或简称为varargs函数)。

答案 1 :(得分:0)

你错过了scanf()的第2至7个参数前面的&符号,我认为这是一个非常常见的错误。 scanf()的附加参数是指向存储找到的值的位置的指针;它需要一个引用才能保存这些数据。

因此,如果没有&符号,确实存在类型不匹配。也就是说,我不明白为什么提到double