我的代码看起来像
#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个参数都会发生,我已将所有变量指定为浮点数,并且它不喜欢它。
我该如何解决这个问题?谢谢!
答案 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。
请注意,scanf
是variadic function(或简称为varargs函数)。
答案 1 :(得分:0)
你错过了scanf()
的第2至7个参数前面的&符号,我认为这是一个非常常见的错误。 scanf()
的附加参数是指向存储找到的值的位置的指针;它需要一个引用才能保存这些数据。
因此,如果没有&符号,确实存在类型不匹配。也就是说,我不明白为什么提到double
。