16

コマンドラインからいくつかの引数を取得するプログラムが必要です。構文は次のとおりです。

getpwd -l user1 user2 ... -L -X -S...

そのため、ユーザーに-lオプションを提供する必要があります。を使用してみgetoptましたが、運が悪かったため、他のオプションを の前に配置した場合にのみ機能します-l

getpwd -L -X -S ... -l user1 user2 ...

私のコード(-l-S):

    while((c = getopt(argc, argv, "l:S")) != -1){
    switch(c){
        case 'l':
            index = optind-1;
            while(index < argc){
                next = strdup(argv[index]); /* get login */
                index++;
                if(next[0] != '-'){         /* check if optarg is next switch */
                    login[lcount++] = next;
                }
                else break;
            }
            break;
        case 'S':
            sflag++;                        /* other option */
            break;
        case ':':                           /* error - missing operand */
            fprintf(stderr, "Option -%c requires an operand\n", optopt);
            break;
        case '?':                           /* error - unknown option */
            fprintf(stderr,"Unrecognized option: -%c\n", optopt);
            break;
      }
   }

optoptoptindですextern int

そこで問題は:getopt()関数 (またはgetopt_long()) を使用できますか? それとも、必要なものを取得するために独自のパーサーを作成する必要がありますか?

4

3 に答える 3

16

あなたのコードは、実際には非常に機能していました。あなたが見逃していたgetopt唯一のことは、 の後に引数を 1 つだけ消費することを期待している-lため、 への最初の引数に続いてコマンド ラインの解析を続行すること-lです。その後ろに隠れてより多くの引数を引き出すためgetopt、コマンドラインの解析をどこから開始するかを再度指定する必要があります。

getoptその情報をグローバル変数に格納しますoptind。行を追加したとき:

optind = index - 1;

break;あなたの場合の前にl、コードが機能し始めました。

于 2013-03-17T22:53:15.397 に答える
0

コマンドライン引数を解析するための C ライブラリ (GPL ライセンス) を作成しました。

https://github.com/Vincenzo1968/myoptParser

https://github.com/Vincenzo1968/myoptParser/blob/master/how_to_use.md

オプションが受け入れる引数の最小数と最大数を指定できます。オプションが 0 個以上の引数 (または 1 つ以上、2 つ以上など) を取るように指定することもできます。もちろん、0、1、2 などの固定数の引数を指定することもできます。

引数のタイプ (string、integer、float) も指定できます。パーサーは、指定された数値と型が一致することを確認し、一致しない場合はエラーを返します。

パーサーでは、オプションが必要かどうかを指定することもできます。最後に、相互に排他的なオプションを指定できます。

于 2013-05-23T20:11:35.303 に答える