0

ユーザーがコマンドラインに 2 つの引数を入力する必要がある C プログラムを作成しようとしています。まず、読み取る値のテキスト ファイルの名前を指定する必要があります。次に、0 または 1 の値を指定する必要があります。この値は、ブール値 (0=false、1=true) として使用される整数として保存されます。

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

int main(int argc, char *argv[]){
   FILE *f;
   char *fname;
   int boolVal;

  if (argc != 2){
    printf("This program requires two input types, data file and boolean value of 0 or 1\n");
    return 1;
  } 

  fmame = argv[1];
  boolVal = argv[2];
  printf("The file name is %s and the boolVal is %d.\n", fmame, boolVal);

   f = fopen(fname, "r");
   if (f == NULL) perror ("Could not open file");
      else {
         if (fgets(myStr, 1000, f) != NULL )
            puts(myStr);
            fclose(f);
      }
   return 0;
}

エラーが発生します:

testArg.c: In function ‘main’:
testArg.c:16: warning: assignment makes integer from pointer without a cast

2 つの質問があります。ファイル名の読み方は正しいですか? 第二に、キャスティングの問題をどのように解決しますか?

4

5 に答える 5

3

ご要望に応じて、

ここで、ユーザーはコマンド ラインに 2 つの引数を入力する必要があります。まず、読み取る値のテキスト ファイルの名前を指定する必要があります。次に、0 または 1 の値を指定する必要があります。この値は、ブール値 (0=false、1=true) として使用される整数として保存されます。

あなたのコードは次のように読むべきです

if (argc != 3)
{  //code

覚えておいてください、バイナリ名もカウントされます。だからas に./<binary> <filename> <1/0>なります。argc3

次に、コード内の警告の理由は

boolVal = argv[2];

すべてのコマンド ライン入力は、文字列 [ char *] の形式で読み取られます。のデータ型を調べてみるとよくわかりますargv[2]。って言うじゃないchar *ですか。次に、その値を変数に割り当てる前に、その(英) 数値文字列整数値に変換する必要があります。int

したがって、ここで必要なのは

boolVal = atoi(argv[2]);

または、さらに優れた推奨事項として、

boolVal = strtol(argv[2], NULL, 0);    

詳細については、の man ページを確認してstrtol()ください。

于 2015-03-24T12:31:13.990 に答える
2

boolその変数に1つのポインターを割り当てています。このようにしなければなりません。

boolVal=atoi(argv[2]);

これで、警告はスローされなくなります。次に、 as ではない状態を確認する必要がありますargc != 3。そうしないと、セグメンテーション違反が発生します。argcゼロからのカウントがあるためです。単純に を与える場合./a.outargcカウントは 1 です。

このようにアクセスしているargv[2]ので、それを確認する必要がありargc != 3ます。

 int atoi(const char *nptr);

atoi配列値を整数値に変換します。のmanページからatoi

atoi() 関数は、nptr が指す文字列の最初の部分を int に変換します。

ここを参照してください

于 2015-03-24T12:31:24.020 に答える
1

これを変える:

if (argc != 2)

これに:

if (argc != 3 || (argv[2][0] != '0' && argv[2][0] != '1') || argv[2][1] != '\0')

この:

boolVal = argv[2];

これに:

boolVal = argv[2][0]-'0';
于 2015-03-24T12:46:02.870 に答える