这篇博客对应线上课程第七次实验。
网易云课堂:http://mooc.study.163.com/learn/USTC-1000002006?tid=1000081002#/learn/announce
实验楼:https://www.shiyanlou.com/courses/122
代码库:http://git.shiyanlou.com/chenxu/shiyanlou_cs122
为menu设置接口
需要添加两个函数MenuConfig,ExecuteMenu用于添加命令和运行menu程序;另外需要HandleArgv处理命令字符串集,再传给执行命令的具体函数。
- MenuConfig函数
主要是对前几次实验的initMenu函数进行抽象,使它能重用。内容可参见实验截图2。在第一次添加menu命令时会自动添加help命令。 - ExecuteMenu函数
这个函数是对原来的main函数的重写,这里添加了对命令参数的支持,对输入的字串进行处理,处理的方法见HandleArgv函数。 - HandleArgv函数
内容见实验截图1。主要是使用strtok对传入的字串进行分割,再返回分割后的字串和子串个数。需要注意的是要在整个字串后面加一个’\0’,否则在之后使用getopt函数时会把回车当做一个命令参数。
Makefile
编写MakeFile可以实现自动化编译,编写完成后,使用make命令,gcc可以按照设置进行编译连接生成运行文件。Makefile内容见截图4.
处理命令参数
这里使用了
while ((ch = getopt(argc,argv,optstr)) != -1)
{
switch(ch)
{
case 'a':
ShowAllCmd(head);
break;
case 'd':
p = (tDataNode*)SearchLinkTableNode(head, SearchCondition, optarg);
if ( p == NULL)
{
printf("Without this cmd!\n");
break;
}
printf("%s - %s\n", p->cmd, p->desc);
break;
default:
printf("-a show all cmd\n");
printf("-d [] show specify cmd\n");
}
}
while循环内getup会遍历命令字符串内容,会返回-之后的参数,同时将该选项的参数保存在optarg中(没有就设为NULL),再通过switch匹配对应参数选项的操作。