11

-d オプションを入力し、オプションの後にオプションではない引数を指定するかどうかに関係なく、何かを行うプログラムがあります 。
私のコードは次のとおりです。

#include <stdio.h>
#include <getopt.h>
#include <stdlib.h>

#define OPT_LIST "d::" 

int main (int argc, char *argv[])
{
    int c;
    char string[] = "blah";

    while ((c = getopt (argc, argv, OPT_LIST)) != -1)
    {
        switch (c)
        {
            case 'd':
                    printf("%s\n", optarg);
                    break;

            case '?':
                fprintf(stderr, "invalid option\n");
                exit(EXIT_FAILURE);
        }   
    }
}

したがって、オプションの後にオプションではない引数を入力すると、引数が出力されます。ただし、ユーザーがオプションではない引数を指定しない場合は、char "string" を出力する必要があります (これが、OPT_LIST に二重コロンを入れる理由です)。しかし、これを行う方法がわからないので、どんな助けでも大歓迎です。

プログラムを実行すると、次のようになります。

user:desktop shaun$ ./arg -d hello
hello
user:desktop shaun$ ./arg -d 
./arg: option requires an argument -- d
invalid option

C言語を使用してOS XでMacを実行しています。

4

4 に答える 4

17

「オプションのオプション値」機能は GNU libc の拡張機能にすぎず、POSIX では必須ではなく、おそらく Mac OS X に同梱されている libc では単に実装されていません。

options 引数は、このプログラムで有効なオプション文字を指定する文字列です。この文字列のオプション文字の後にコロン (':') を付けて、必要な引数を取ることを示すことができます。オプション文字の後に 2 つのコロン ('::') が続く場合、その引数はオプションです。これは GNU 拡張です。

https://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html

実際、POSIX.1-2008、セクション 12.2、「ユーティリティ構文ガイドライン」では、この機能を明示的に禁止しています。

ガイドライン 7: オプション引数はオプションであってはなりません。

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_02

于 2013-10-26T08:51:08.820 に答える
4

多分私は質問を誤解しています。ユーザーがgetoptのデフォルトのエラー処理をオーバーライドしたいように読んでいます。その場合、OPT_LIST の先頭に : があってはいけませんか? 上記のコードは良いと思いますが、それでも印刷されると思います

./arg: option requires an argument -- d

それを抑えるために、OPT_LIST の先頭に : が必要ではないでしょうか? たとえば、次のように変更します。

while ((c = getopt (argc, argv, "d:f:")) != -1)

これに:

while ((c = getopt (argc, argv, ":d:f:")) != -1)

私が間違っている場合は修正してください。

于 2015-01-27T22:41:24.433 に答える