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

本文详细介绍了如何设计并实现一个支持带参数命令的菜单子系统,包括使用MenuConfig函数替代InitMenuData,以及如何通过getopt函数解析命令行参数。同时,文中提供了Makefile的配置示例,用于自动化构建包含多个源文件的项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验过程

(注释: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();
    }
     实验代码

转载于:https://my.oschina.net/doumenghan/blog/631055

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值