2

等号が含まれている場合、C++ でコマンドライン オプションを解析するにはどうすればよいですか? 例は次のとおりです。

./testApp --parameter1=value1

次の行を使用して、引数が存在するかどうかを確認します。

bool cmdOptionExists(char** begin, char** end, const std::string& option)
{
    return std::find(begin, end, option) != end;
}

ただし、引数に等号が含まれている場合、これは false を返します。

cmdOptionExists(argv, argv+argc, "parameter1");

均一な印刷:

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

パラメータ 1 の表示は含まれません。ただし、等号を削除すると、正しく印刷されます。

4

2 に答える 2

5

のコマンドラインオプションargvはスペースで区切られています。したがって、key=valueオプションを自分で検出するか、コマンドラインパーサーを使用する必要があります。Boost ::ProgramOptionsをお勧めします。

例:

namespace po = boost::program_options;
po::options_description desc("Allowed options");
desc.add_options()
    ("foo", po::value<std::string>(), "do bar")
;

po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);

std::string foo;

if (vm.count("foo")) {
    foo = vm["foo"].as<std::string>();
} else {
    throw("Foo not set.");
}
于 2012-08-31T07:29:17.337 に答える
1

他のものを解析できるのと同じ方法でそれらを解析できます。あなたの例でargv[1]は、おそらく"--parameter1=value1".[1]が含まれ'='ます。に変換することから始めますが、これは実際には必要ありません。に見られるような null で終了する文字列の場合 、は「開始」イテレータであり、は「終了」イテレータです。std::find'='std::stringargv[i]argv[i]argv[i] + strlen( argv[i] )

[1] 正式には、標準ではこれについてあまり言及されていません。これは、プログラム内の何かが実行される前にすべてが発生するためです。ただし、実際には、最も一般的なシステムでは、プログラムを呼び出すプログラムが、ほとんどすべてのものを渡すことができargv[0]ます。そして、私が知っているすべてのシェルまたはコマンド プロセッサは、空白を使用してコマンド ラインを単語に分割し、メタ文字が存在しません。(何がメタキャラクターと見なされ、どのように扱われるかは大きく異なります。)

于 2012-08-31T07:57:25.460 に答える