c ++ 11命令行参数分离

时间:2016-08-06 17:13:18

标签: c++ c++11 parameter-passing

我对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“而已。 我知道如果我在整个论点中使用引号,它会起作用,但我不明白为什么会这样发生.. 有人可以向我解释一下吗?

1 个答案:

答案 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。