0%

C++解析命令行参数

  1. 头文件
  2. 在MFC中使用
  3. 在控制台程序中使用

头文件

1
2
3
4
#include <map>
#include <regex>
#include <string>
using namespace std;

在MFC中使用

通过__argc获取参数数量,通过__targv获取宽字符串,并转为std::string

1
2
3
4
5
6
7
8
9
10
11
12
13
void ParseCommandLine(map<string, string>& cmds)
{
for (int i = 1; i < __argc; i++)
{
string para = ws2s(__targv[i]);
smatch base_match;
if (regex_match(para, base_match, regex("(--|-)([a-z]|[A-Z])*")))
{
string key = &*base_match[1].second;
cmds[key] = ws2s(__targv[++i]);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
std::string ws2s(const std::wstring& ws)
{
int len;
int slen = (int)ws.length() + 1;
len = WideCharToMultiByte(CP_ACP, 0, ws.c_str(), slen, NULL, 0, NULL, NULL);
char* buf = new char[len];
WideCharToMultiByte(CP_ACP, 0, ws.c_str(), slen, buf, len, NULL, NULL);
std::string r(buf);
delete[] buf;
return r;
}

在控制台程序中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void CDlgSpatialRefSysDlg::ParseCommandLine(int argc, char* argv[], map<string, string>& cmds)
{
for (int i = 1; i < argc; i++)
{
string para = argv[i];
smatch base_match;
if (regex_match(para, base_match, regex("(--|-)([a-z]|[A-Z])*")))
{
string key = &*base_match[1].second;
cmds[key] = argv[++i];
}
}
}

int main(int argc, char* argv[])
{
map<string, string> params;
ParseCommandLine(argc, argv, params);
}