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;
}

そして、次のコンパイル エラーが表示されます。

ここで、x は数字の 1 つです。これは scanf コマンドの 6 つの引数すべてで発生します。すべての変数を float として指定しましたが、それは気に入りません。

これを修正するにはどうすればよいですか? ありがとう!

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 関数は、テンプレート文字列 template の制御下で、ストリーム stdin から書式設定された入力を読み取ります。オプションの引数は、結果の値を受け取る場所へのポインタです。

「ポインタ」の部分に注意してください。


もう 1 つの質問は次のとおりdoubleですfloat。これは、comp.lang.c FAQ の質問 15.10で回答されています。

Q: float パラメーターを受け入れる varargs 関数があります。なぜ機能しないのva_arg(argp, float)ですか?

A: 可変長引数リストの可変長部分では、古い「デフォルトの引数昇格」が適用されます。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 も参照してください。

可変引数関数(または略して varargs 関数) でscanfあることに注意してください。

于 2013-09-13T13:38:21.070 に答える
0

の 2 ~ 7 番目の引数の前にアンパサンドがありません。scanf()これは非常によくある間違いだと思います。 scanf()の追加の引数は、見つかった値を格納する場所へのポインターです。そのデータを保存できるようにするには、参照が必要です。

したがって、アンパサンドがないと、実際に型の不一致があります。そうは言っても、なぜ言及しているのかは私には明らかではありませんdouble

于 2013-09-13T13:36:02.733 に答える