c++11命令行参数分离
c++ 11 command line parameter separation
我对c++11很陌生,我真的不知道如何将命令行参数解析为argv指针。。。
我有这个代码:
int main(int argc, char* argv[])
{
std::string curr_arg = "";
std::string str_base = "";
std::string str_subs_file = "";
std::string str_subs = "";
for(int i = 1; i < argc; i++)
{
curr_arg = argv[i];
if(curr_arg == "-b" || curr_arg == "--base")
{
str_base = argv[++i];
}
else if(curr_arg == "-f" || curr_arg == "--file")
{
str_subs_file = argv[++i];
}
else if(curr_arg == "-s" || curr_arg == "--subs")
{
str_subs = argv[++i];
}
else
{
std::cout << "Argument '" << argv[i] << "' is not recognised." << std::endl;
return -1;
}
}
}
当我用调用我的程序时/subs-b基-sa=1,2,3;b=4,5,6;c=6,7,8当我进入if(curr_arg == "-s" || curr_arg == "--subs"
块时,我希望我得到"a=1,2,3;b=4,5,6,7,8"作为参数,而我只收到"a=1,3"。我知道如果我在整个争论中引用引号是有效的,但我不明白为什么会这样。。有人能向我解释吗?
您面临的问题不是C++,而是命令shell。这很可能是因为您的shell将分号作为命令分隔符。
您的shell将您的命令解释为./subs -b base -s a=1,2,3
,然后检测分号并解释下一个命令,在您的情况下是b=4,5,6
,与c=6,7,8
相同。
它与键入(应该在大多数Unix shell上都能工作(基本相同:
echo abc; sleep 5; echo def 5 seconds later
这会打印"abc",睡眠5秒,然后打印"def 5秒后"。
解决方案:为了得到你想要的东西,你可以用引号封装零件a=1,2,3;b=4,5,6;c=6,7,8
,比如:
./subs -b base -s "a=1,2,3;b=4,5,6;c=6,7,8"
或者你可以转义分号,比如:
./subs -b base -s a=1,2,3;b=4,5,6;c=6,7,8
我认为,这两个版本都应该适用于大多数(如果不是全部的话(Unix shell,也可以在windows cmd中使用。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 如何在模板参数中分离函数类型返回类型和参数
- 如何用默认模板参数分离模板类的声明和实现
- C++模板:使用模板参数分离定义和实现
- 如何在分离声明和定义时为友元函数提供默认参数
- 在Ctor调用中,将std::initializer_list与括号内的参数分离
- c++11命令行参数分离