3

コマンドライン引数からオプション-10を取得するにはどうすればよいですか-" tail-10 "。getopt関数は「1」文字を検索します。しかし、文字列「10」にアクセスするにはどうすればよいですか?

getopt_longでこれを実行できる場合は、例が役立ちます。ありがとう。

4

4 に答える 4

3

ここで起こっていることは、c言語には、コマンドラインオプションを処理する適切な方法に関する標準がまったくないということです。

さらに、UNIXの世界にはかなり長い間そのような標準がありませんでした( Unix Haters Handbook(PDFリンク)にそれに関するセクション全体があると信じています)。

そのため、人々はアドホックな処理メカニズムを作成しました。これらは最終的に共通の(っぽい)標準に向かって進化し、getopt(ベル研究所で)生まれました。後でGNUgetoptとを入手しましたgetopt_long。ただし、これらは必須ではなく、一部のプログラムは依然として独自の方法で物事を管理します。

しかし、物事が落ち着く前(そして時にはその後)、人々は、良いアイデアのように思われるときはいつでも、オプションを処理する「通常の」方法に新しい機能を追加しました。さて、他のどの機能よりも頻繁に行tailを調整したいというのはかなり良い賭けです。そのため、調整を簡単にし、キーストロークを少なくすることは、当時は良い考えのように思えたに違いありません...

于 2010-08-16T03:56:31.440 に答える
3

-1あなたがその議論としてオプションになるつもりでない限り0、答えはあなたがそうしないということです。getopt標準のPOSIXユーティリティのオプション構文に適合するオプションを処理するためにのみ作成されています。この目的でGNUを使用することもgetopt_long、独自のパーサーを作成することもできますargv(簡単です)。

編集:実際、私はあなたが欲しいものを読み間違えたと思います。-その数値のオプションとして解釈される任意の数字が後に続く場合は、そのバージョンが機能するとは思われませんgetopt。すべての数字をオプションとして特殊なケースにする方法はありません。getoptすべての数字が引数を取るオプション文字であると単純に言うと、引数が(これで問題ありません。解釈できます)-123のオプションとして解釈されます。そこから)、しかし、孤独は次の要素をへの引数として取得します。これは回復するのが困難または不可能です。-123-1argveaten-1

于 2010-08-16T03:43:24.963 に答える
0

私はgetoptがそれほど好きではなかったので、いつものことをして、車輪の再発明をしました。私は自分のソリューションをargoptと呼んでいます。ソースとマニュアルページはhttps://github.com/colding/argoptで入手できます。getoptよりもはるかに使いやすいと思います。

于 2010-08-16T12:08:58.897 に答える
0

可能であれば、数値引数を回避するためにコマンド引数の構文を変更することをお勧めします。オプションの引数として数値を渡すか(例)、オプションの区切り文字-n -5の後にのみ許可します。--

引数の構文を変更できない場合は、BSD getopt(3)のマニュアルページのBUGSセクションにこれを行う方法が記載されています。POSIXで指定されておらず、glibcでサポートさoptresetれていないを回避するようにソリューションを調整しました。

int ch;
long num;
char *numarg;

while ((ch = getopt(argc, argv, "0123456789")) != -1) {
    switch (ch) {
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
        numarg = argv[optind - 1];
        if (numarg[0] == '-' && numarg[1] == ch && numarg[2] == '\0') {
            num = '0' - ch;
        } else if ((numarg = argv[optind]) != NULL && numarg[1] == ch) {
            char *ep;
            int numoptind = optind;

            num = strtol(numarg, &ep, 10);
            if (*ep != '\0') {
                fprintf(stderr, "illegal number -- %s\n", numarg);
                return EXIT_FAILURE;
            }

            /* Advance getopt internal state to next argument. */
            while (optind == numoptind) {
                ch = getopt(argc, argv, "0123456789");
                assert(ch >= '0' && ch <= '9');
            }
        } else {
            fprintf(stderr, "number after other options -- %s\n", numarg);
            return EXIT_FAILURE;
        }
        break;

    default:
        /* Unrecognized option character.  Error printed by getopt. */
        return EXIT_FAILURE;
    }
}

必要に応じて、短いオプションまたは長いオプションに置き換えgetoptgetopt_long追加することができます。

于 2016-07-28T20:50:28.283 に答える