コードのリビジョン 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 つだけ置く必要があります。