0

基本的に、他のオプションの前に非オプションがある場合、getopt は -1 を返します。

    n = atoi(argv[1]);

    while ((opt = getopt(argc, argv, "hi:o:")) != -1) {
        switch (opt) {
        case 'i':
            ifile = optarg; 
            break;
        case 'o':
            ofile = optarg; 
            break;
        case 'h':
            printf("...");
            break;
        default:
            printf("Invalid Option\n");
            exit(0);
        }
    }

例:

./a.out 22 -i infile -o outfile

これにより、getopt は -1 を返し、switch ステートメントは実行されません。

./a.out -i infile -o outfile

ただし、これは機能しますが、最初のオプションは単なる数字にして、別のオプションを含める必要はありません。

getopt がこのケースを処理するはずだと思っていましたが、間違っている可能性があります。どんな助けでも大歓迎です!

4

1 に答える 1

1

ユニバーサル ソリューション

提示された問題を回避する最も簡単な方法は次のとおりです。

n = atoi(argv[1]);

argv[1] = argv[0];
++argv;
--argc;

while ((opt = getopt(argc, argv, "hi:o:")) != -1)
{
    ...as before...
}

これにより、最初のオプションが効果的に消費され、オーソドックスな形式に変更されます。getopt()これは、標準 (デファクトおよびデジュア) にリモートで準拠しているの任意のバージョンで機能します。を再割り当てしない場合、 は元の値 (この例では番号) を「プログラムの名前」として使用することに注意しargv[1] = argv[0];getopt()くださいargv[1]

GNU の使用getopt()

GNUgetopt()では、問題を処理する方法が 2 つあります。オプション以外の (「ファイル名」) 引数が、オプション文字コード 1 (ASCII SOH 制御文字; 別名Control-A) が前に付いているかのように扱われるように、「順番に戻る」機能を使用するものがあります。もう 1 つはデフォルト モードを使用しgetopt()、オプションを処理するときにオプションを並べ替えます。これは、Mac OS X などのプラットフォームではデフォルトで使用できないことに注意してください。

このコードはほとんど両方の仕事をします。オプション文字列を 'permute' モード (表示) と 'return in order' モードの間で変更するだけです"-hi:o:"

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

int main(int argc, char **argv)
{
    int n;
    int opt;
    char *ifile = 0;
    char *ofile = 0;

    n = atoi(argv[1]);

    while ((opt = getopt(argc, argv, "hi:o:")) != -1)
    {
        printf("Option: %c\n", opt);
        switch (opt)
        {
        case 'i':
            ifile = optarg;
            break;
        case 'o':
            ofile = optarg;
            break;
        case 'h':
            printf("...");
            break;
        case 1:
            n = atoi(optarg);
            break;
        default:
            printf("Invalid Option %d\n", opt);
            exit(1);
        }
    }

    printf("argc = %d; optind = %d\n", argc, optind);
    for (int i = optind; i < argc; i++)
        printf("argv[%d] = %s\n", i, argv[i]);

    if (ifile != 0)
        printf("i-file: %s\n", ifile);
    if (ofile != 0)
        printf("o-file: %s\n", ofile);
    printf("%d\n", n);

    return 0;
}

「permute」を使用した実行例:

$ go9 9 -i in -o out
Option: i
Option: o
argc = 6; optind = 5
argv[5] = 9
i-file: in
o-file: out
9
$

「順番に戻る」を使用した実行例:

$ go9 9 -i in -o out
Option: 
Option: i
Option: o
argc = 6; optind = 6
i-file: in
o-file: out
9
$

これを機能させたい場合は、環境変数 POSIXLY_CORRECT が設定されていないことを確認してください。オプション文字列の前に aを付けて、 +POSIX に似た動作を強制することができます。

于 2013-11-03T22:47:35.630 に答える