“软件工程(C编码实践篇)”实验报告(六)
“软件工程(C编码实践篇)”实验报告(六)
逍遥蓝云 发表于2年前
“软件工程(C编码实践篇)”实验报告(六)
  • 发表于 2年前
  • 阅读 10
  • 收藏 0
  • 点赞 1
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 实验六:将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();
    }
     实验代码
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 2
博文 23
码字总数 17574
×
逍遥蓝云
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: