前言
很多时候我们实现地理模型,为了有较好的运算速度,会选择使用C++进行开发,而且大多数时候是采用Win32控制台项目的方式打包。缺少了可视化界面的参数输入,则采用命令行的方式。但是地理模型的命令行又不像可视化一样——对应参数项输入,而是采用将所有参数整合成一条命令行。
命令行一般表现为: -参数项 内容 -参数项 内容 -参数项 内容…,例如,-stringVector AAA#BBB#CCC -string DDD -double EEE。对于需要输入为列表的参数可以使用指定的分隔符连接起来,这里使用"#"。
以下就这类命令行进行解析,使其转换为地理模型各自对应的参数。
代码实现
void parseStringToVector(const string& str, char c, vector<string>& tokens) {
unsigned int posL = 0;
unsigned int posR = 0;
while (posR < str.length() - 1) {
posR = str.find_first_of(c, posL);
string sub = str.substr(posL, posR - posL);
tokens.push_back(sub);
posL = posR + 1;
}
}
void parseArgv(int argc, char* argv[], vector<string> &vector_variable, string &string_variable, double &double_variable) {
int i = 1;
while (i < argc) {
if (strcmp(argv[i], "-stringVector") == 0) {
i++;
if (i < argc) {
parseStringToVector(argv[i], '#', vector_variable);
i++;
}
else { exit(1); }
}
else if (strcmp(argv[i], "-string") == 0) {
i++;
if (i < argc) {
string_variable= argv[i];
i++;
}
else { exit(1); }
}
else if (strcmp(argv[i], "-double") == 0) {
i++;
if (i < argc) {
sscanf(argv[i], "%lf", &double_variable);
i++;
}
else { exit(1); }
}
}
}
int main(int argc, char* argv[]) {
vector<string> mVector;
string mString;
double mDouble;
// 测试输入:-stringVector AAA#BBB#CCC -string DDD -double 20.0
parseArgv(argc, argv, mVector, mString, mDouble);
// 通过这样的方式,就能够将输入的命令行解析到对应的变量中了
// mVector -- ["AAA","BBB","CCC"]
// mString -- "DDD"
// mDouble -- 20.0
}