我对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 base -sa = 1,2,3; b = 4,5,6; c = 6,7,8调用我的程序时,我希望得到“a = 1, 2,3; b = 4,5,6; c = 6,7,8“作为参数,当我进入if(curr_arg == "-s" || curr_arg == "--subs"
块而不是我刚刚收到”a = 1,2,3“而已。
我知道如果我在整个论点中使用引号,它会起作用,但我不明白为什么会这样发生..
有人可以向我解释一下吗?
答案 0 :(得分: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。