高软实验七

高软实验七

GitHub仓库地址
学号:SA17225491 姓名:张佳伟

实验目的

  1. 为menu程序创建子程序接口,增强menu程序的可重用性。
  2. 学会创建Makefile工程文件,使得编译连接更加程序化。
  3. 学会利用命令行的argc,argv参数,构建可以输入带参数的命令。

实验步骤

  1. 创建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()函数来获得命令行传来的参数,并加以处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值