3

複数のコマンド ライン引数を受け入れる必要があるプログラムがあります。最終的に出力される文字列の最大長と最小長を指定する引数 n を受け入れるように設定する必要がある段階になりました。基本的に、入力は次のようになります。

-a -n7,7 -i // with -a and -i being other arguments

引数を自分で選択するのは問題ありませんが、それらの最大値と最小値も抽出する方法がわかりません。試してみましたが (以下を参照)、変数の最小値と最大値を使用しようとすると、実行時エラーが発生します。乾杯。

int c;
while ((c = getopt(argc, argv, ":wpsaevin")) != -1) {
    switch (c) {
        case 'w': // pattern matches whole word
            mode = WHOLE;
            break;
        case 'p': // pattern matches prefix
            mode = PREFIX;
            break;
        case 'a': // pattern matches anywhere
            mode = ANYWHERE;
            break;
        case 's': // pattern matches suffix
            mode = SUFFIX;
            break;
        case 'e': // pattern matches anywhere
            mode = EMBEDDED;
            break;
        case 'v': // reverse sense of match
            reverse_match = true;
            break;
        case 'i': // ignore case of pattern
            ignore_case = true;
            break;
        case 'n': //Specifies word length
            length_spec = true;
            cin >> minimum >> maximum;
            if (minimum == 0 && maximum == 0) { //no word limit
                length_spec = false;
            } else if (maximum == 0) {
                maximum = 100;
            }
            break;
    }
}
argc -= optind;
argv += optind;
4

2 に答える 2

3

このページから:

この変数は、引数を受け入れるオプションのオプション引数の値を指すように getopt によって設定されます。

case 'n': //Specifies word length
            length_spec = true;
            char *cvalue = optarg;
            // TODO: Split cvalue by delimiter
            // to obtain minimum and maximum
            if (minimum == 0 && maximum == 0) { //no word limit
                length_spec = false;
            } else if (maximum == 0) {
                maximum = 100;
            }
            break;

文字列を分割する例:

#include <iostream>
#include <string>
#include <algorithm>

int
main()
{
  const char* test = "1000,2000";
  std::string str = std::string(test);
  auto find = std::find(str.begin(), str.end(), ',');
  std::string first = std::string(str.begin(), find);
  std::string second = std::string(find+1,str.end());
  std::cout << first << " " << second;
  // 1000 2000
}

編集

参考リンク

C++11 を使用できる場合は、次のように使用することを検討してstd::stoiください。

  int first_int = std::stoi( first );
  int second_int = std::stoi ( second );

そうでない場合は、これを試してください:

  std::replace(str.begin(), str.end(), ',', ' ');
  std::istringstream ss(str);
  ss >> first_int;
  ss >> second_int;
  std::cout << first_int << " " << second_int << std::endl;

私はatoi最後の手段として使用します。

単純な実装は次のようになります (自己責任で使用してください)。

int convert(std::string s)
{
    int size = s.size();
    int exp = size - 1;
    int result = 0;
    for (int i = 0; i < size; i++)
    {
        char c = s[i];
        result += (int)(c - '0') * std::pow(10, exp--);
    }
    return result;
}
于 2013-11-12T01:02:54.860 に答える
0

@aaronmanが上記で提案したように、Boost Library Program Optionsを使用できます。

于 2013-11-12T01:31:58.110 に答える