7

現在、次のようなコードがあります。

while (( flags = getopt(argc, argv, "abc")) != -1){
    switch(flags){
    case 'a':
        dflag = 1;
        break;
    case 'b':
        rflag = 1;
        break;
    case 'c':
        cflag = 1;
        break;
    }
}

問題は、 testprogram -c -d 1 のようなものを含めたかったことです

-d を処理するには c が必要ですが、-c を使用しない場合、testprogram -d 1 は引数なしで実行されます。

さまざまなことを試しましたが、これを機能させることができないようです。

どんな助けでも大歓迎です。

4

1 に答える 1

4

利用できるオプションは2つあると思います。1つは機能し、もう1つは機能する場合と機能しない場合があります。

「機能する場合と機能しない場合がある」オプションは、次のように例示されます。

char *opts = "abc";
char *opts_d = "abcd:";

while ((opt = getopt(argc, argv, opts)) != -1)
{
    switch (opt)
    {
    case 'a':
        aflag = 1;
        break;
    case 'b':
        bflag = 1;
        break;
    case 'c':
        cflag = 1;
        opts = opts_d;
        break;
    case 'd':
        dflag = 1;
        dvalue = optarg;
        break;
    default:
        ...error handling...
        break;
    }
}

[への連続した呼び出しで有効なオプションのリストを変更することを妨げるものがあるかどうかgetopt()][1]はわかりませんが、通常、オプションを変更することは行われていません。したがって、注意して扱ってください。-cオプションが見つからない場合、のopt値がdによって返されることgetopt()はないため、コードはそれ以外の方法で実行されないことに注意してください。-dユーザーがの前にオプションを入力すると-cgetopt()を処理するときに無効なオプションが報告されることに注意してください-d。エラー報告を制御できます。あなたはおそらくしなければならないでしょう。(optopt変数には、無効として検出された実際のオプション文字が含まれています。)

「動作します」オプションは次のとおりです。

while ((opt = getopt(argc, argv, "abcd:")) != -1)
{
    switch (opt)
    {
    case 'a':
        aflag = 1;
        break;
    case 'b':
        bflag = 1;
        break;
    case 'c':
        cflag = 1;
        break;
    case 'd':
        if (cflag == 0)
            ...report error about must use -c option before -d option...
        dflag = 1;
        dvalue = optarg;
        break;
    default:
        ...error handling...
        break;
    }
}
于 2012-10-20T05:40:43.500 に答える