c ++中的命令行解析器

时间:2012-09-24 13:04:56

标签: c++ parsing command-line console

我有下一个代码:

#include "CmdLine.h"

void main(int argc, TCHAR **argv)
{

  CCmdLine cmdLine;



  // parse argc,argv 
  if (cmdLine.SplitLine(argc, argv) < 1)
  {
     // no switches were given on the command line, abort
     ASSERT(0);
     exit(-1);
  }

  // test for the 'help' case
  if (cmdLine.HasSwitch("-h"))
  {
     show_help();
     exit(0);
  }

  // get the required arguments
  StringType p1_1, p1_2, p2_1;
  try
  {  
     // if any of these fail, we'll end up in the catch() block
     p1_1 = cmdLine.GetArgument("-p1", 0);
     p1_2 = cmdLine.GetArgument("-p1", 1);
     p2_1 = cmdLine.GetArgument("-p2", 0);

  }
  catch (...)
  {
     // one of the required arguments was missing, abort
     ASSERT(0);
     exit(-1);
  }

  // get the optional parameters

  // convert to an int, default to '100'
  int iOpt1Val =    atoi(cmdLine.GetSafeArgument("-opt1", 0, 100));

  // since opt2 has no arguments, just test for the presence of
  // the '-opt2' switch
  bool bOptVal2 =   cmdLine.HasSwitch("-opt2");

  .... and so on....

}

我实现了CCmdLine类,这个主要是如何使用它的例子。 我很难理解如何获得输入值。我试图从控制台用scanf读取它们,但是argc不会增加并导致读取错误。

我是c ++的初学者,我想知道是谁让这段代码有效。

谢谢。

3 个答案:

答案 0 :(得分:1)

Argcargv 包含程序启动时传递的参数。因此,如果您使用myapp.exe option1 option2 option3执行此操作,而不是使用argv执行该操作:

  • myapp.exe //<--argv[0]
  • option1 //<--argv[1]
  • option2 //<--argv[2]
  • option3 //<--argv[3]

简而言之,当一个程序启动时,main的参数被初始化以满足以下条件:

  • argc大于零。
  • argv[argc]是一个空指针。
  • argv[0]argv[argc-1]是表示实际参数的字符串的指针。
  • argv[0]将是包含程序名称的字符串,如果不可用,则为空字符串。 argv的剩余元素表示提供给程序的参数。

您可以找到更多信息,例如here

所有尝试稍后阅读输入(使用cinscanf或其他任何内容)都不会将输入值保存到argv,您需要自己处理输入。< / p>

答案 1 :(得分:0)

在运行程序时从命令行传递输入值 e.g

program_name.exe arg1 arg2

答案 2 :(得分:0)

这很简单:

void main(int argc, char **argv)
{
    std::string arg1(argv[0]);
    std::string arg2(argv[1]);
}