第05天 获取程序的命令行参数

视频讲解

今天要学习的案例对应的源代码目录:src/chapter02/ks02_04。本案例不依赖第三方类库。程序运行效果如图2-21所示。

今天的目标是掌握如下内容。

  • 解析程序的命令参数。
  • 命令参数的设计。

图2-21 第05天案例程序运行效果

请思考,如果我们想在程序启动时或者为程序设置某种启动状态,或者让程序启动时加载某个文件,而这个文件由用户临时指定,该怎样处理呢?为了在启动时控制程序的运行状态,可以为程序设计命令参数。本案例中程序及其命令参数的样例为“ks02_04_d -term -f文件名-test”。命令参数的具体含义见代码清单2-8中几个变量的注释。除此之外,本案例还支持以如下方式查询程序支持的命令参数:ks02_04_d -help。程序的命令参数由main()函数传入。如标号①处所示,在main()函数的参数列表中,argc表示程序启动时的参数个数,argc包含启动的程序本身,argv是参数列表。当用户输入ks02_04_d -help时,argc=2,argv[0]=ks02_04_d,argv[1]=-help。标号②处的注释表明,后续定义的变量用来保存命令参数,而这些变量的默认值最好按照程序运行的默认状态进行设置。比如,如果用户未输入任何命令参数,那么这些变量就会保持默认值,程序启动后就会按照这些变量的默认值运行。

代码清单2-8

下面介绍命令参数的解析过程,见代码清单2-9。在标号①处指明了本程序命令参数的设计规则,即所有命令参数均以“-”开头。因为有多个命令参数,所以需要使用for循环进行遍历,见标号②处。请注意,i的取值从1开始,这是因为argv[0]永远是程序本身,如本案例中的ks02_04_d。在标号③处,判断命令参数是否为“-term”,然后更新bTerminal的值。在标号④处,判断命令参数是否为“-f”,也就是判断程序是否从文件加载数据并更新bFileMode的值。如果命令参数含有“-f”,那么根据命令参数的设计规则,接下来应该提供文件名,所以需要继续判断后面是否还有参数,见标号⑤处。因为在标号①处已经说明了命令参数的设计规则,而文件名不算做命令参数,只算作命令参数“-f”的扩展参数,所以如果文件名中包含“-”,就可以认为文件名非法,见标号⑥处,这相当于用户未输入文件名而直接输入了下一个命令参数。在标号⑦处,判断文件名合法后,将i进行自加以便指向下一个命令参数。如果没有看懂本段所讲的内容,可以调试一下程序以便加深理解。调试程序的方法见第07天的学习内容。

代码清单2-9

在完成所有命令参数的解析之后,输出信息用来指明程序的运行状态,见代码清单2-10。

代码清单2-10

现在简单总结如下命令参数的设计原则。

  • 命令参数用来设置程序启动后的初始运行状态。
  • 为命令参数设置一定的规则。比如,一般使用“-”开头的文本作为命令参数,如“-help”“-term”等。
  • 可以为某个命令参数设置扩展参数,原则上扩展参数应紧跟在该命令参数之后,扩展参数最好设计成不以“-”开头的字符串。
  • 最好提供关于命令参数的帮助。比如,用“-help”可以获取所有命令参数的帮助信息。