您的位置:首页 > 其它

“软件工程(C编码实践篇)”实验报告(六)

2016-03-04 00:00 211 查看
摘要: 实验六:将menu设计为可重用的子系统

实验过程

(注释:mkfile 和mkdir 命令可以带-hXXX/-lXXX 例如 mkfile -hppp 意思就是调用mkfile函数 执行-h命令参数值为ppp )

1 为menu子系统设计接口。

menu.h
int MenuConfig(char *cmd, char *desc, int (*handler)());int ExcuteMenu();

将menu.c里的main函数改成ExcuteMenu()函数,讲重写InitMenuData(),用MenuConfig()函数实现原来InitMenuData()的功能。参考老师的代码实现。

2 完成Makefile

CC_PTHREAD_FLAGS   = -lpthread
CC_FLAGS           = -cCC_OUTPUT_FLAGS    = -o
CC                 = gcc
RM                 = rm
RM_FLAGS           = -f
TARGET             = m
OBJS               = link_table.o link_list.o business_logic_layer.o menu.o
all:    $(OBJS)    $(CC) $(CC_OUTPUT_FLAGS) $(TARGET) $(OBJS)
.c.o:
$(CC) $(CC_FLAGS) $<
clean:
$(RM) $(RM_FLAGS) $(OBJS) $(TARGET) *.bak

3 使menu子系统支持带参数的命令,使用getopt函数

int executeMenu()
{
printf("Ctrl c to exit\n");
while(1)
{
int argc=0;
char *argv[CMD_MAX_ARGV_NUM];
char cmd[CMD_LEN];
char *pcmd=NULL;
printf("please input cmd >");
pcmd=fgets(cmd,CMD_LEN,stdin);
if(pcmd==NULL)
{
continue;
}
pcmd=strtok(pcmd," ");
while(pcmd!=NULL&&argc<CMD_MAX_ARGV_NUM)
{
argv[argc]=pcmd;
argc++;
pcmd=strtok(NULL," ");
}
if(argc==1)
{
int len=strlen(argv[0]);
*(argv[0]+len-1)='\0';
}
int i=business_find_cmd(argc,argv);
if(i==FAIL)
{
continue;
}
}
}

mygetopt函数
int myGetopt(int argc,char* argv[])
{
int ch;
while((ch=getopt(argc,argv,"h:l:"))!=-1)
{
switch(ch)
{
case 'h':
printf("option h,name:%s",optarg);
strcpy(argv[1],optarg);
break;
case 'l':
printf("option l,name:%s",optarg);
strcpy(argv[1],optarg);
break;
}
return SUCCESS;
}
printf("wrong cmd\n");
executeMenu();
}

实验代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: