0

我的代码看起来像

#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 个参数都会发生这种情况,我已将所有变量指定为浮点数,但它不喜欢这样。

我该如何解决?谢谢!

4

2 回答 2

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 函数在模板字符串模板的控制下从流标准输入读取格式化输入。可选参数是指向接收结果值的位置的指针。

注意“指针”部分。


另一个问题是:“为什么警告抱怨 a double,而我通过了 a float”?这在 comp.lang.c FAQ问题 15.10中得到了回答:

问:我有一个接受浮点参数的可变参数函数。为什么不va_arg(argp, float)工作?

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

请注意,这scanf是一个可变参数函数(或简称 varargs 函数)。

于 2013-09-13T13:38:21.070 回答
0

您在 2nd-7th 参数前面缺少&符号scanf(),我认为这是一个非常常见的错误。 scanf()的附加参数是指向存储找到的值的位置的指针;它需要一个引用才能保存该数据。

因此,如果没有与号,则确实存在类型不匹配。也就是说,我不清楚为什么提到double.

于 2013-09-13T13:36:02.733 回答