2

getopt_long()コマンドライン引数を解析するために使用したい。man ページを読んだ後、オプションの後に 1 つの引数しか解析できないことがgetopt_long()わかりました。このコマンドラインを次のように解析するgetopt_long()ために使用する方法はありますか:getopt_long()

./a.out -s 127.0.0.1 2012 -u stackoverflow

結果を与えるには:

ip = 127.0.0.1
port = 2012
username = stackoverflow

これが私が試したことです:

while (1) {
    int this_option_optind = optind ? optind : 1;
    int option_index = 0;
    static struct option long_options[] = {
        {"server", required_argument, NULL, 's'},
        {"user", required_argument, NULL, 'u'},
        {0, 0, 0, 0},
    };

    c = getopt_long(argc, argv, "s:u:", long_options, &option_index);
    if (c == -1)
        break;

    switch (c) {

        case 's':
            printf("option %s", long_options[option_index].name);
            if (optarg) {
                printf(" with arg %s", optarg);
            }
            printf("\n");

        case 'u':
            printf("option %s", long_options[option_index].name);
            if (optarg) {
                printf(" with arg %s", optarg);
            }
            printf("\n");

        case '?':
            break;

        default:
            printf("?? getopt returned character code 0%o ??\n", c);
    }
}
4

2 に答える 2

4

最初の答えは: の使用または変更を妨げるものは何もないということですoptindoptind < argcthenoptindが の次の共通線引数のインデックスである場合argv、それ以外の場合はこれ以上引数はありません。したがって、処理ループでその引数を使用できますが、それはあなたの責任です:

  • が範囲内にあることを確認するoptind( < argc)
  • 引数 atargv[optind]が別のオプションであるかどうか (つまり、 で始まるかどうか-)を確認します。
  • optind使用した引数が によって再スキャンされないようにインクリメントしますgetopt

2 番目の答えは、次のとおりです。このような非標準的なことを行う前に、3 回考える必要があります。もう少し入力するように思えるかもしれませんが、-p PORTオプションなどのより標準的な手法を使用する十分な理由があります。標準的なコマンド ライン オプションの動作に慣れているユーザーにとっては、文書化が容易で、実装の手間が少なく、驚くことも少なくなります。

break最後に、コード例でいくつかのステートメントが欠落しているため-s、 も であると報告され-uます。

于 2012-11-12T02:17:15.527 に答える
0

次のようにプログラムを呼び出すとします。

./a.out -s "127.0.0.1 2012" -u stackoverflow

その場合の"127.0.0.1 2012"価値として得られます。optarg's'

于 2012-11-12T08:37:09.737 に答える