0

「このプログラムでは、プログラム パラメータを使用してユーザー データを収集したいと考えています。たとえば、program -c 20which でコンパイルすると、20 が摂氏に変換され、 でコンパイルするとprogram -f 20、プログラムは 20 が華氏に変換されます。プログラムは、またはargv[0]としてのみ受け入れることができます。 ,浮動小数点に変換されます. 以下は私のプログラムです. いくつかの警告とエラーが表示されます. 正しく理解するのを手伝ってもらえますか. -c-fargv[1]

 #include <stdio.h>
 #include <string.h>


 int main(int argc, char *argv[])
 {

    const char* c = "-c";
    const char* f = "-f";

    float temp_c;


    if(0==strcmp(argv[1],c))
    { 
      sscanf(s,"%f",&temp_c);
      temp_c =  (argv[2]-32)*5/9;
      printf("%f celsius = %f fahrenheit", &temp_c, argv[2]);


    }else if(f0==strcmp(argv[1],f)){

 sscanf(s,"%f",&temp_c);
 temp_c =  argv[1]*9/5+32;
 printf("%f celsius = %f fahrenheit", &temp_c, argv[2]);

    }else

    {
      printf("please use correct flag");
      exit(0);
    }
 }
4

4 に答える 4

2

これは間違いです (および実装定義の動作):

char c = "-c";
char f = "-f"; /* Note I added missing closing "/ */

への変更:

const char* c = "-c";
const char* f = "-f";

argv[0]プログラムの名前です。最初の引数は に格納されargv[1]ます。==を使用して C の文字列の内容を比較することはできない(==文字列が格納されている配列のベース アドレスを比較する) ため、これは正しくありません。

if(argv[0] == c)

への変更:

if (0 == strcmp(argv[1], c))

条件も同じelse if

scanf()ではなくを使用sscanf()して、ユーザー入力を取得し ( sbtw は未定義です)、その戻り値をチェックして、変数に値が割り当てられていることを確認します。

if (1 == scanf("%f", &temp_c))

最終的な計算は正しくありません:

temp_c =  (argv[1]-32)*5/9

への変更:

temp_c =  (temp_c-32)*5/9

他の計算も同様。

于 2012-10-17T10:45:09.367 に答える
2
char c = "-c";
char f = "-f;

これは問題です。""意味string しますが、これらの変数を次のように宣言していますchar

使用する、

char c[] = "-c";
char f[] = "-f";

を使用してそれらを比較しますstrcmp(argv[1], c)

于 2012-10-17T10:40:48.153 に答える
1

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

于 2012-10-17T12:05:30.017 に答える