凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

コマンドライン引数をstd::mapに格納

バッチファイルからコマンドライン引数をプログラムに渡して,データを大量に得たい!って状況がある際に,コマンドライン引数をいちいち展開するのは面倒です.argv[1] は a に渡して,argv[2] は b に渡して…なんてやってたら,渡したいパラメータが増えたり減ったりした際に,うがー!!ってなりますね.そこで次のように std::map に格納してしまえば簡単に取り出すことができます.

#include <iostream>
#include <cstdio>
#include <string>
#include <map>

using namespace std;

int main(int argc, char* argv[]) {
	map<string, double> arg;
	for (int i = 1; i < argc; ++i) {
		char name[64], val[64];
		sscanf(argv[i], " %[^=]=%s", name, val);
		arg.insert( make_pair( name, atof(val) ) );
	}
	cout << arg["hoge"] << endl;
	cout << arg["fuga"] << endl;
	cout << arg["piyo"] << endl;
	return 0;
}
> ./a hoge=2.0 fuga=10000 piyo=test
> 2
> 10000
> 0

今回は double にしてしまいましたが,取り敢えず std::string に格納しておいて使用するときに所望のものへキャストとしても良いかもしれませんね.

#include <iostream>
#include <cstdio>
#include <string>
#include <map>

using namespace std;

int main(int argc, char* argv[]) {
	map<string, string> arg;
	for (int i = 1; i < argc; ++i) {
		char name[64], val[64];
		sscanf(argv[i], " %[^=]=%s", name, val);
		arg.insert( make_pair( name, val ) );
	}
	cout << atof(arg["hoge"].c_str()) << endl;
	cout << atoi(arg["fuga"].c_str()) << endl;
	cout << arg["piyo"] << endl;
	return 0;
}
> ./a hoge=2.0 fuga=10000 piyo=test
> 2
> 10000
> test