高软实验七
GitHub仓库地址
学号:SA17225491 姓名:张佳伟
实验目的
- 为menu程序创建子程序接口,增强menu程序的可重用性。
- 学会创建Makefile工程文件,使得编译连接更加程序化。
- 学会利用命令行的argc,argv参数,构建可以输入带参数的命令。
实验步骤
- 创建menu.h文件,并定义menu子程序的两个接口分别为MenuConfig与ExecuteMenu。其中MenuConfig用来配置命令,ExecuteMenu用来执行命令行菜单 。
//add cmd to menu;
int MenuConfig(char* cmd, char* desc, int (*handler)(int argc, char* argv[]));
//Menu Engine Execute;
int ExecuteMenu();
2.实现MenuConfig和ExecuteMenu接口
int MenuConfig(char* cmd, char* desc, int (*handler)(int argc, char* argv[]))
{
tDataNode* pNode = NULL;
if(head == NULL){
head = CreateLinkTable();
pNode = (tDataNode*)malloc(sizeof(tDataNode));
pNode->cmd = "help";
pNode->desc = "Menu List:";
pNode->handler = Help;
AddLinkTableNode(head,(tLinkTableNode *)pNode);
}
pNode = (tDataNode*)malloc(sizeof(tDataNode));
pNode->cmd = cmd;
pNode->desc = desc;
pNode->handler = handler;
AddLinkTableNode(head, (tLinkTableNode *)pNode);
return 0;
}
//ExecuteMenu取代原来的main函数;
int ExecuteMenu()
{
while(1)
{
int argc = 0;
char cmd[CMD_MAX_LEN];
printf("input an cmd number>");
//scanf("%s", cmd);
char* argv[CMD_MAX_ARV_NUM];
char* pcmd = NULL;
pcmd = fgets(cmd,CMD_MAX_LEN,stdin);
if(pcmd == NULL)
{
continue;
}
pcmd = strtok(pcmd, " ");
while(pcmd !=NULL && argc < CMD_MAX_ARV_NUM)
{
argv[argc] = pcmd;
argc++;
pcmd = strtok(NULL," ");
}
if(argc == 1)
{
int len =strlen(argv[0]);
*(argv[0]+len-1)='\0';
}
tDataNode* p=(tDataNode*)SearchLinkTableNode(head, SearchCondition, (void*) argv[0]);
if(p == NULL)
{
printf("this is a wrong cmd\n");
continue;
}
printf("%s,%s", p->cmd, p->desc);
if(p->handler != NULL)
{
p->handler(argc, argv);
}
}
}
3.创建Makefile工程文件
ALL:
gcc menu.c linktable.c -o menu
4.利用命令行参数实现带参的命令。并以test命令为例。
int Test(int argc, char* argv[])
{
int ch;
opterr = 0;
while((ch = getopt(argc,argv,"abc"))!= -1)
{
switch(ch)
{
case 'a': printf("option a:a\n"); break;
case 'b': printf("option b:b\n"); break;
default: printf("other option :c");
}
//printf("optopt +%c\n",optopt);
}
return 0;
}
实验演示
如图所示当输入test -a 时,输出为option a:a
而在命令行输入test -b 时,输入为option b:b
实验心得
通过这次实验让我了接到了,重构的重要性,每一次在源代码上的改进,都使得原先的代码更加通用,增加了代码的可重用性。也了解到了linux的Makefile配置文件的使用,立即如何试用getopt()函数来获得命令行传来的参数,并加以处理。