2016-04-05 5 views
0

私はgetoptを使用してコマンドラインからパラメータを解析しています。オプションのパラメータの順序を認識させる問題があります。getoptは何らかの順序でパラメータを取得していません

私はこれらのケースを達成したい:

$ ./program -i file.html -o output.html #ex 1 
$ ./program -i -o file.html output.html #ex 2 
$ ./program -o output.html -i file.html #ex 3 

私のコードは、私もしばらく外

for(int i = optind; i < argc; i++) { 
    printf("non optional argument %s\n", argv[i]); 
    return 0; 
} 
を書いてきた、これをよりよくデバッグするこの

while((c = getopt(argc, argv, "hi:o:")) != -1) { 
    switch(c) { 
     case 'h': 
      //prints the help file 
      break; 
     case 'i': 
      ivalue = optarg; 
      break; 
     case 'f': 
      fvalue = optarg; 
      break; 
     case '?': 
      //prints an error 
      break; 
     default: 
      abort(); 
    } 
} 

のように見えます

のように、例1と例3は正しく動作していますが、例2では、​​パラメータが真っ直ぐになっていません。最初は私はそれが単純にこの機能では不可能だと思ったが、次にthisの例で私はそれを見た。

さらに、パラメータなしでプログラムを呼び出すと、abort()が表示されません。

私はubuntu 15.10とgcc 5.2.1をapt-getでインストールしています。

+2

例#2は、標準のPOSIXコマンドライン形式( 'getopt'によって実装されています)に従いません。オプション引数はオプションの直後になければなりません。 – interjay

+1

リンク先の例があなたを混乱させました。 '-a'オプションが別の位置にスワップされていますが、そのオプションは引数を受け付けないことに注意してください。 '-o'オプションは引数を受け入れ、' -o'とその引数の間に '-a'を挿入しません。 @interjayが観察するように、オプションが引数を受け入れる場合、その引数はそのオプションに直接従わなければなりません。 –

答えて

0

this例[可能]でした。

いいえ、あなたはありませんでした。あなたのオプション-iには引数が必要ですが、動作していないケースでは、-iとその引数の間に別のオプションを挿入しようとします。これは許されません - オプションが引数を取る場合(オプションであれ、必須であれ)、その引数(指定されている場合)はオプション文字の直後になければなりません。あなたがリンクした例は、異なって表示されません。

あなたがしようとしているのは、getopt()でサポートされているだけでなく、標準のUnixの規約に従いません。さらに、の引数が必要な場合は、の引数で想像するように動作する可能性がありますが、のオプションの場合は、の引数では完全に実行できません。引数がオプションである場合、それらが直接続く必要がない場合、引数をオプションと正確に一致させる方法はありません。

パラメータを指定しないでプログラムを呼び出すと、どうしてabort()が呼び出されないのですか?

なぜでしょうか?コマンドラインでプログラムにオプションが指定されていない場合、getopt()は最初の呼び出しで-1を返し、ループ本体は決して実行されません。あなたのコードからabort()を取得するには、オプション文字列にあるオプションを指定する必要がありますが、それは特定のケースを指定しないか、引数を必要とするオプションを指定する必要があります。イベントgetopt()':'を返しますが、具体的なケースは記載していません)。コードは現在書かれているので、引数の有無にかかわらず、-oでなければならず、引数なしで-iである必要があります。

0

getoptで行うことはできません。あなたのoptstringにある"i:"は、-iオプションが存在する場合には引数を持たなければならないことを意味します。あなたの2番目の例では、これはの引数として解釈され、オプションではなく、-oが解釈されることを意味します。

Linux上でglibcにリンクしている場合は、:: GNU拡張子(例:"hi::o:")を使用して、オプションの引数を取ることができます。-iしかし、オプションの引数(例えば、-ifile.html)の直後にオプションの引数が必要であるため、これは最初の例と3番目の例を破ります。

関連する問題