1

C でコマンド ライン引数を解析する必要があります。引数は基本的に int または float で、デフォルト値と範囲制約があります。

次のようなものを実装し始めました。

option_float(float* out, int argc, char* argv, char* name, description,
    float default_val, int is_optional, float min_value, float max_value)

たとえば、次のように呼び出します。

float* pct;
option_float(pct, argc, argv, "pct", "My super percentage option", 50, 1,
    FALSE, 0, 100)

ただし、車輪の再発明はしたくありません。

私の目的は、範囲制約のエラーチェックを行い、オプションがオプションではなく設定されていない場合にエラーをスローすることです。そして通常、usage() 関数によって与えられるヘルプ メッセージを生成します。

使用法テキストは次のようになります。

--pct     My super percentage option (default : 50). Should be in [0, 100]

私は getopt から始めましたが、やりたいことがあまりにも限られているため、このような単純なユースケースではまだコードを書きすぎる必要があると感じています。

どのような代替手段をお勧めしますか?

4

1 に答える 1

0

Linux用にコーディングしていると仮定すると...

二重ダッシュ オプションについては、getopt_long (man 3 getopt_long) を試してください。

また、バリデーターを汎用関数にしてみて、getopt/getopt_long を解析の難しい部分にして、オプションに必要な引数をチェックしてください。

いずれにせよ、関数を定義どおりに使用したい場合、サンプル呼び出しは定義どおりには機能しません。

簡単な例:

int main( int argc, char **argv )
{
  float pct = 0.0
  if( !GetArgs(argc, argv, &pct) )
    DoStuff(pct)
}

int GetArgs( int argc, char **argv, float *thePct )
{
  extern char *optarg;
  int  rc = 0;

  (*thePct) = 50.0  /* default val */

  while( (opt = getopt(argc, argv, "hp:")) != -1 )
  {
    switch( opt )
    {
      case  'p':
            (*thePct) = atof( optarg );
            break;

      case  'h':
            MyUsage();  /* Explain everything */
            rc = -1;
            break;
    }
  }

  if( !rc )
  {
    rc = ValidatePct( (*thePct),   /* value to check */
                      0.0,         /* low pct val */
                      100.0 );     /* hi pct val */

    /* Other validations here */

    if( !rc )
      MyUsage();
  }
}

これにより、次のような呼び出しが可能になります。

$ myprogram -p 45.0

パーサー getopt と getopt_long に固執する場合は、grep のように、オプションの後に N 個の他の引数が続くコマンド ラインを作成することもできます。たとえば、次のようになります。

grep -in -e "SomeRegex" file1, file2, ..., fileN

純粋な好奇心から、あなたは PERL プログラマーではありませんよね?

于 2010-12-27T15:23:26.837 に答える