高软实验七

来源:互联网 发布:海上钢琴师知乎 编辑:程序博客网 时间:2024/06/08 16:11

高软实验七

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

原创粉丝点击