1

C での getopt のエラー処理について質問があります。

#include <unistd.h>
#include <getopt.h>

void showFunction()
{
   printf("show function\n");
}

void printHelp()
{
   printf("print help info\n");
}

#define HELP 1
#define SHOW_OPTION 2

int main(int argc, char *argv[])
{    
    const struct option long_opts[] = {{"help",      no_argument, NULL, HELP},
                                       {"show",      no_argument ,NULL, SHOW_OPTION},
                                       {NULL,   0,           NULL, 0}};
    int opt;

    while((opt = getopt_long_only(argc, argv, "", long_opts, NULL)) != -1)
    {
        switch(opt) {
            case HELP:
                printHelp();
                break;
            case SHOW_OPTION:
                showFunction();
                break;
            case '?':
                printHelp();
                break;
            default:
                printf("type base --help for details\n");
        }
    }
    return 0;
}

この部分はいくつかのエラーを処理します:

case '?':
                printHelp();
                break;

しかし、./base --or ./base -or ./base sdfsor./base -- fsfsと入力すると、無効な入力をすべて処理できないため、上記の入力を処理するにはどうすればよいですか? 誰でも助けることができますか?

4

1 に答える 1

0

getopt関数は、オプション (-hや など--help) だけでなく、いわゆるオプション以外の引数もサポートします。たとえば./base --show arg1 arg2、 , then--showはオプションですが、arg1andarg2はオプションではない引数です。--また、これらのダッシュの後のすべての引数が非オプション引数であることを示すために、明示的にオプションを入れることができます。

あなたの例では、、、などの-オプションは非オプションの引数です。(他の関数と同様に)配列内の最初の非オプション要素を指すように extern 変数を設定します。sdfsfsfsgetopt_longonlygetoptoptindargv

あなたの例を見てみましょう:

./base --:--それ以降のすべてがオプションではないことを示す特別なオプションと同様に、このコマンド ラインは完全に有効であり./base、オプションなしで呼び出すのと同じです。

./base -: 変数の値はoptind1 になり、. 単一のダッシュを非オプションの引数として扱います。argv[1]"-"-

./base -- fsfs: ここで、--は無視されます。これは、その後に非オプション引数のみが存在しfsfs、最初の非オプション引数であるためoptind、 2 に等しくなり、 is であることを示しているためargv[2]です"fsfs"

オプション以外の引数を期待しない場合は、 の値がoptindと等しいことを確認してくださいargc。小さい場合は、argcオプションではない引数があることを意味します。

if (optind < argc) {
    /* at least one non-option argument exists */
    printHelp();
}
于 2014-10-15T11:14:29.430 に答える