2010-12-26 9 views
1

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

私は、たとえば呼び出す
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の使用を開始しましたが、それは私がやりたいことのためにあまりにも限られており、私はそれがまだ ためにあまりにも多くのコードを書くために私を必要と感じますこのような単純なユースケースです。

どのような方法をお勧めしますか?ダブルダッシュオプションの

+2

[C/UNIXのための引数構文解析ヘルパー](http://stackoverflow.com/q/189972/2509)はいくつかのオプションを上書きしています。私はあなたのすべての要件を満たすものは知らないが、 'gengetopt'は書かなければならないコードの量を減らすだろう。 – dmckee

+0

gengetoptは残念ながらGPLですが、goptとglibは良い候補に見えます。私はこれらの2つのオプションを探求します。ありがとう – agramfort

答えて

0

あなたは、Linuxをコードしていると仮定すると...

するTryのgetopt_long(男性3のgetopt_long)。

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

どのような場合でも、関数を定義どおりに使用したい場合、サンプル呼び出しは定義どおりに動作しません。

簡単な例:あなたは、あなたがまた続くオプションをとるコマンドラインを作ることができるのgetoptとのgetopt_longパーサに固執する場合

$ myprogram -p 45.0 

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

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(); 
    } 
} 

grepのようなN個の引数は、例えば以下のようになります。

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

out of sheer cuあなたはPERLのプログラマーではありませんか?

+0

それは素敵でシンプルなデザインのgetoptですが、私はPythonプログラマーにとってはあまりにも冗長です;)私は上記のようにgoptとglibを探求します。ありがとう – agramfort

+0

これはC言語のゲームの名前です。これはPythonよりはるかに低レベルの言語です。 – buzzwang

関連する問題