1. ホーム
  2. c++

[解決済み】C++でgetopt()を使って引数を処理する方法

2022-03-17 17:23:21

質問

プログラムはこのように動作し、引数は最初にこのような形式で与えられます。

<ブロッククオート

-w 猫

文字列 "cat"は変数 パターン で続く各文字に対して - この場合、mode = Wを設定します。私が困っているのは、引数の形式です。

-w -s -n3,4 cat

今、私は以前のように信じています。 モード は、読み取った順番にW,S,Nに設定されます。そして、もし私がどのような順番の文字列を記憶しておきたいのであれば、次のようにします。 モード ループが終わった後に、その情報を配列に格納すればいいのです。また、本来であれば パターン には、文字列 "cat" が代入されます。私が間違っているか、これを行うための簡単な方法がある場合は、私を修正します。

次に、3 と 4 の数字にアクセスし、保存できるようにしたい。その方法がよくわかりませんし、argc -= optind; と argv += optind;はどうするのでしょうか。ただし、引数は文字列配列に格納されていると思います。

enum MODE {
    W,S,N
} mode = W;
int c;
while ((c = getopt(argc, argv, ":wsn")) != -1) {
    switch (c) {
        case 'w': 
            mode = W;
            break;
        case 's': 
            mode = S;
            break;
        case 'n':
            mode = N;
            break;   
    }
}
argc -= optind; 
argv += optind; 

string pattern = argv[0];

更新:数値にアクセスする方法がわかりました。ループ中にargvに何が入っているかを確認する必要がありました。だから、そこで見つけた値を別の変数に保存して使うことになると思う。

どのように解決するのですか?

getopt は、グローバル変数 optarg 値を持つパラメータが指定されたとき。例えば

for(;;)
{
  switch(getopt(argc, argv, "ab:h")) // note the colon (:) to indicate that 'b' has a parameter and is not a switch
  {
    case 'a':
      printf("switch 'a' specified\n");
      continue;

    case 'b':
      printf("parameter 'b' specified with the value %s\n", optarg);
      continue;

    case '?':
    case 'h':
    default :
      printf("Help/Usage Example\n");
      break;

    case -1:
      break;
  }

  break;
}

参照 こちら は、より完全な例です。

3と4の数字にアクセスし、保存できるようにしたい。

これはカンマで区切られたリストであるため、次のようにパースする必要があります。 optarg をトークンのために使用します ( strtok を使用し、その後 atoi などで、それぞれを整数に変換してください。