22

私はgetopt() の例cvalueを読みましたが、例のコードのように、整数を引数オプションとして受け入れる方法を示していません:

 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>

 int
 main (int argc, char **argv)
 {
   int aflag = 0;
   int bflag = 0;
   char *cvalue = NULL;
   int index;
   int c;

   opterr = 0;

   while ((c = getopt (argc, argv, "abc:")) != -1)
     switch (c)
       {
       case 'a':
         aflag = 1;
         break;
       case 'b':
         bflag = 1;
         break;
       case 'c':
         cvalue = optarg;
         break;
       case '?':
         if (optopt == 'c')
           fprintf (stderr, "Option -%c requires an argument.\n", optopt);
         else if (isprint (optopt))
           fprintf (stderr, "Unknown option `-%c'.\n", optopt);
         else
           fprintf (stderr,
                    "Unknown option character `\\x%x'.\n",
                    optopt);
         return 1;
       default:
         abort ();
       }

   printf ("aflag = %d, bflag = %d, cvalue = %s\n",
           aflag, bflag, cvalue);

   for (index = optind; index < argc; index++)
     printf ("Non-option argument %s\n", argv[index]);
   return 0;
 }

上記を のように実行した場合はtestop -c fooになりcvalueますfooが、必要な場合はどうなりtestop -c 42ますか? cvalueは のタイプなので、 bechar *にキャストできますか? 私はこれを直接使用してアクセスせずに整数としてキャストしようとしましたが、で印刷すると常に大きな負の数になります。私は正しく逆参照していないと思いますか、わかりません...optarg(int)getopt()argv[whatever]%dargv[]

4

7 に答える 7

38

atoi()文字列から整数に変換するために使用する必要があります。

于 2011-01-25T17:18:20.163 に答える
23

上記の回答はすべておおむね正しいです (Vikram.exe は、ライブラリ関数を呼び出さなければならない理由を説明するための小道具を取得しますが、他の誰も気にしませんでした)。ただし、呼び出す正しいライブラリ関数を指定した人はいません。使用しないでくださいatoi。使用しないでくださいsscanf

負の数を許可したくない場合はstrtol、またはその相対を使用します。入力が数値でないstrtoul場合、これらの関数のみが十分な情報を提供します。たとえば、ユーザーが次のように入力した場合

./a.out 123cheesesandwich

atoi元気よく 123をsscanf返しますが、これはほとんどの場合、あなたが望むものではありません。Onlyは、文字列の最初の数文字のみを処理しstrtolたことを ( 経由で) 通知します。endptr

( はありませんが、浮動小数点数を読み取る必要strtoiがある場合はあります。)strtod

于 2011-01-25T17:55:38.417 に答える
11

コードで既に使用したように、main関数のプロトタイプは次のとおりです。

int main (int argc, char** argv)

コマンド ライン引数として提供される引数は、char * (または単に文字列) の配列として「プログラム」に渡されます。そのため、prog を として呼び出すとfoo.exe 123、 の最初の引数foo.exeは整数値の 123 ではなく文字列 123 になります。

おそらく次のようなものを使用して(あなたが言ったように)引数を整数にキャストしようとすると(int) argv[1]、最初の引数の整数値は取得されませんが、最初の引数がアドレス空間に格納されているメモリアドレスが取得されます。整数値を取得するには、文字列値を整数値に明示的に変換する必要があります。これには、atoi関数を使用できます。変換に使用できる同様の関数については、このマニュアル ページを確認してください。

于 2011-01-25T17:30:25.073 に答える
5

を使用しatoiます。

cvalue = atoi( optarg );

cvalue を として宣言しintます。

于 2011-01-25T17:18:21.797 に答える
4

atoi()、これは ascii to integer が使用する関数であることを意味します。同様に、atof()float 値を取得するために使用できます。

于 2011-01-25T18:26:13.340 に答える
1

この状況では、私はsscanf().

于 2011-01-25T17:19:06.297 に答える
0

いいえ、キャストして整数値に変換することはできません。sscanf、atoi、atol などの関数を使用して変換する必要があります。

于 2011-01-25T17:19:55.220 に答える