読者です 読者をやめる 読者になる 読者になる

凹みTips

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

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

C++

バッチファイルからコマンドライン引数をプログラムに渡して,データを大量に得たい!って状況がある際に,コマンドライン引数をいちいち展開するのは面倒です.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