用函数指针实现跳转表与查询跳转表

编写程序实现如下功能

1、输出如下内容:

命令
 0   增加设备
 1   删除设备
 2   修改设备
 3   查询设备
 4   监视设备状态

命令(输入相应数字):

 

2、分别对应5个功能定义5个实现函数,通过判断输入的数字,执行相应的操作;

3、使用函数指针数组实现。

程序设计思路:

  1. 实现函数显示输出菜单文字;
  2. 按照要求,需要输入0,1,2,3,4数字来执行相应的命令;
  3. 因为需要每个数字对应一个功能,而且是以列表的形态出现,所以考虑使用数组来建立一个表;
  4. 根据题目,使用数字作为功能索引,而且从数字0开始,所以可以直接创建函数指针数组,然后根据cmd对应的数字,以这个数字为下标,就能取出对应函数的指针。
  5. 原理也就是通过使用数组的下标,来跟对应的函数建立联系。

编码实现:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define     DIM(x)  (sizeof(x)/sizeof(x[0]))
 5 
 6 void display_menu(void);//显示菜单
 7 int get_cmd(void);      //从终端获取数字指令的输入
 8 void run_cmd(int cmd);   //执行命令
 9 
10 /*每条指令对应的执行函数*/
11 void cmd_add(void);
12 void cmd_del(void);
13 void cmd_modify(void);
14 void cmd_list(void);
15 void cmd_view(void);
16 
17 /*定义函数指针数组,每个元素指向一个函数*/
18 typedef void (*cmd_handle_t)(void);
19 const cmd_handle_t handles[ ]={
20     cmd_add,      /*[0]*/
21     cmd_del,      /*[1]*/
22     cmd_modify,   /*[2]*/
23     cmd_list,     /*[3]*/
24     cmd_view      /*[4]*/
25 };
26 
27 /*执行命令*/
28 void run_cmd(cmd)
29 {
30     if (cmd >= 0 && cmd < DIM(handles))
31     {
32         (handles[cmd])(); //从handles数组中的取出函数指针,并执行
33     }
34     else
35     {
36         printf ("非法指令\n");
37     }
38 }
39 
40 int main(int argc, char *argv[])
41 {
42     int cmd;
43     display_menu ();    //显示菜单
44     while(1)
45     {
46         cmd = get_cmd (); //获得指令输入
47         run_cmd (cmd);    //执行命令
48     }
49     exit (EXIT_SUCCESS);
50 }
51 
52 /*显示菜单*/
53 void display_menu(void)
54 {
55     printf ("命令\n");
56     printf (" 0   增加设备\n");
57     printf (" 1   删除设备\n");
58     printf (" 2   修改设备\n");
59     printf (" 3   查询设备\n");
60     printf (" 4   监视设备状态\n");
61     printf ("\n");
62 }
63 
64 /*从终端获取数字指令的输入*/
65 int get_cmd(void)
66 {
67     int cmd;
68     int ret; //保存scanf的返回值
69     printf ("命令(输入相应数字,按<Ctrl-C>退出):");
70     ret = scanf ("%d", &cmd);
71     if (ret == 0) //没获取到符合%d的输入
72     {
73         /*用getchar函数释放输入缓冲区*/
74         while(getchar() != '\n')
75             ;
76         return -1;
77     }
78     return cmd;
79 }
80 
81 /*定义5个函数,分别执行不同命令*/
82 void cmd_add(void)   {printf("执行增加设备操作\n");}
83 void cmd_del(void)   {printf("执行删除设备操作\n");}
84 void cmd_modify(void){printf("执行修改设备操作\n");}
85 void cmd_list(void)  {printf("执行查询设备操作\n");}
86 void cmd_view(void)  {printf("监视设备状态\n");}
87 

使用数组的索引,就能执行对应的函数,这样的一个表,就可以称作跳转表。

修改程序功能如下:

命令
add      增加设备
del      删除设备
modify   修改设备
list     查询设备
view     监视设备状态

命令(输入相应命令):

数字改成字符串,同样执行5个函数,通过判断输入的单词,执行相应操作。 

修改思路:

  1. 本题要使用字符串作为索引,用来跟对应的函数做匹配,因为不是数字,所以就不能使用数组来建立这种对应关系;
  2. 命令使用字符串,每条字符串命令对应一个功能实现,所以要把字符串和实现函数建立一个联系,可以使用结构体建立这种联系,结构体中放一个表示命令的字符串和一个函数指针。
  3. 一个结构体代表一条指令,存在多条指令,以列表的形式出现,所以建立一个结构体数组表示一个菜单。

完整实现代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 #define     DIM(x)  (sizeof(x)/sizeof(x[0]))
 6 
 7 void display_menu(void);//显示菜单
 8 
 9 void run_cmd(const char *cmd);   //执行命令
10 
11 /*每条指令对应的执行函数*/
12 void cmd_add(void);
13 void cmd_del(void);
14 void cmd_modify(void);
15 void cmd_list(void);
16 void cmd_view(void);
17 
18 
19 /*定义新类型,把命令字符串和函数指针关联到一起*/
20 typedef struct __cmd_handle_s
21 {
22     const char *cmd;              //命令名称
23     void (*handle)(void);   //执行函数
24 }cmd_handle_t;
25 
26 
27 /*定义函数指针数组,每个元素指向一个函数*/
28 const cmd_handle_t handles[]={
29     {"add",  cmd_add    },
30     {"del",  cmd_del    },
31     {"mod",  cmd_modify },
32     {"list", cmd_list   },
33     {"view", cmd_view   },
34 };
35 
36 /*执行命令*/
37 void run_cmd(const char *cmd)
38 {
39     int i;
40     for (i = 0; i < DIM(handles); i ++)
41     {
42         if (strcmp(handles[i].cmd, cmd) == 0) //比较字符串相等
43         {
44             handles[i].handle();
45             return;
46         }
47     }
48     printf ("非法指令\n");
49 }
50 
51 int main(int argc, char *argv[])
52 {
53     char cmd[32];
54     display_menu ();    //显示菜单
55     while(1)
56     {
57         printf ("命令(输入相应数字,按<Ctrl-C>退出):");
58         scanf("%s", cmd);  //清除字符串末尾的\n
59         run_cmd (cmd);    //执行命令
60     }
61     exit (EXIT_SUCCESS);
62 }
63 
64 /*显示菜单*/
65 void display_menu(void)
66 {
67     printf ("命令\n");
68     printf ("add   增加设备\n");
69     printf ("del   删除设备\n");
70     printf ("mod   修改设备\n");
71     printf ("list  查询设备\n");
72     printf ("view  监视设备状态\n");
73     printf ("\n");
74 }
75 
76 /*定义5个函数,分别执行不同命令*/
77 void cmd_add(void)   {printf("执行增加设备操作\n");}
78 void cmd_del(void)   {printf("执行删除设备操作\n");}
79 void cmd_modify(void){printf("执行修改设备操作\n");}
80 void cmd_list(void)  {printf("执行查询设备操作\n");}
81 void cmd_view(void)  {printf("监视设备状态\n");}
82 

使用结构体将索引和执行方法联系在一起,然后用这个结构体建立一个数组,使用的时候通过对结构体元素中的索引进行逐一匹配查找,然后执行相应方法,这样的一个表,就可以称作查询跳转表

转载于:https://my.oschina.net/lvsin/blog/805535

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值