6

getoptを使用するときに、オプションに2つの引数を1つの文字列として渡す別の方法はありますか?通常、私は次のことを行います。

./command -o "key value" [command arguments]

次に、引数文字列を明示的に分割する必要があります

 while ((op = getopt(argc, argv, "o:")) != EOF) {
    switch (op) {
             case 'o': 
                 char* result = NULL;
                 result = strtok_r(optarg," ");
                 while(result) {
                     /* DO STUFF */
                     result = strtok(NULL," ");
                 }

                 break;
             default:
                 printUsage()
                 break;
   }

だから、私は次のことを行うことが可能かどうか疑問に思っています:

./command -o key value [command arguments]

getoptに「value」をコマンド引数ではなく-o2番目の引数として扱わせる。

4

2 に答える 2

12

POSIX標準getopt()は、単一のフラグ文字に対する複数の引数をサポートしていません。利用できるオプションがいくつかあります。

1つのオプションは、オプション文字を区切るための引数として名前を指定することです(または同じものを2回使用します)。

./command -o key -v value
./command -o key -o value

もう1つのオプションは、POSIX標準getsubopt()と次のようなコマンドライン表記を使用することです。

./command -o key=value

これは、キーのセットが比較的小さい場合(キーのセットが大きい場合はあまりうまくいきませんが、それがなくても簡単に自分でgetsubopt()解析できる場合)、表示されているシナリオでは非常にうまく機能します。optarg=

もう1つのオプションは、必要に応じて複数の引数を受け入れるコマンドラインパーサーを作成することです。私は、私たちが仕事で使用するプログラムでの多様で統制の取れていない引数処理を解析できるように1つ作成しました。これは、それほど難しくはありません(ただし、まったく簡単ではありませんでした)。具体的には、単一のフラグの後にN(N> 1)オプション値を処理する必要があります。ソースを見たい場合は私に連絡してください(私のプロフィールを参照してください)。-オプション文字の後に3つの名前が必要であるが、最初の3つの引数の1つがダッシュで始まるか、表示される場合など、解決するのが難しい問題がいくつかあり--ます。可変数ではなく、固定数の引数のみを許可しますが、これは、私のユースケースが可変数をカバーする必要がなかったためです(また、あなたのユースケースのようには聞こえません)。

于 2011-12-19T22:37:31.430 に答える
1

オプションがどこで終わり、どこから始まるかをどうやっgetoptて知るのでしょうか?-ocommand arguments

簡単な回避策の1つは、-o指定子に使用することです。

$ cat t.c
#include<stdio.h>
#include<getopt.h>

int main(int argc, char **argv)
{
    char op;
    while ((op = getopt(argc, argv, "o:")) != EOF) {
        switch (op) {
            case 'o':
                printf("Option: %s\n", optarg);
                break;
            default:
                break;
        }
    }
}
$ gcc t.c
$ ./a.out -o one -o two -o three
Option: one
Option: two
Option: three
于 2011-12-19T09:48:26.743 に答える