c++11命令行参数分离

c++ 11 command line parameter separation

本文关键字:分离 参数 命令行 c++11      更新时间:2023-10-16

我对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中使用。