コードのリビジョン 3 の時点で:
mike@linux-4puc:~> gcc a.c
a.c: In function ‘main’:
a.c:29:16: error: ‘s’ undeclared (first use in this function)
a.c:29:16: note: each undeclared identifier is reported only once for each function it appears in
a.c:30:30: error: invalid operands to binary * (have ‘char *’ and ‘int’)
a.c:33:9: error: ‘f0’ undeclared (first use in this function)
a.c:35:20: error: invalid operands to binary * (have ‘char *’ and ‘int’)
a.c:40:8: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
それでは、それらを見ていきましょう。
1) はい、ここで使用s
しますが、どこにも宣言されていません。sscanf
ここについて読んでください。最初のパラメータはconst char *
、またはコンテンツを見つける文字列です。あなたの場合s
は宣言されていません。temp (または 2 番目のコマンド ライン変数) を取得したいので、argv[2]
ここで渡す必要があります。s
sscanf(s,"%f",&temp_c); --> sscanf(argv[2], "%f", &temp_c);
2) 繰り返しますが、今回は宣言されていないものを使用していますf0
。
else if(f0==strcmp(argv[1],f)){
最初のように 0 が欲しかったように見えるif
ので、削除するだけですf
3)Invalid operands to binary *
は、文字列に対して数学を実行しようとしていて、コンパイラが何をすべきかわからないことを意味します。引数はargv[x]
、数値を渡すかどうかに関係なく文字列です。これは次のとおりです。
temp_c = argv[1]*9/5+32;
有効じゃない。あなたもすでに変換を行っています!それsscanf()
が があなたのためにしたことなので、あなたが望む値はtemp_c
ではなくargv[1]
4)incompatible implicit declaration of built-in function
この場合、標準関数を使用しようとしているexit()
が、正しいヘッダー ファイルをインクルードしていないことを意味します。含める<stdlib.h>
とそれが修正されます。
それは警告とエラーを処理します..しかし、あなたのコードにはまだいくつかのロジックと適合性の問題があります:
printf("%f celsius = %f fahrenheit", &temp_c, argv[2]);
これはあなたが望むものではありません。のアドレスを渡さないtemp_c
でください。ポインタの値ではなく、値が必要です。Cのアンパサンドを読んでください。これらを好きな場所に放り込むことはできません。
%s
このステートメントの 2 つ目の問題は、argv[2] が数値ではなく、文字列であることです (これについては前に説明しました) %f
。あなたの両方で同じ問題printf
。
もう 1 つの問題として、main
関数は を返す必要があります。int
これがint main(...
意味です。関数を終了する前に、return 0;
またはexit(0);
You have one があることを確認する必要がありますが、その場合に限りますelse
。関数の最後に、無条件に 1 つだけ置く必要があります。