输入字符串转换为执行函数

    技术2022-05-19  29

    /* user_interface.h */#ifndef __USERINTERFACE__H__#define __USERINTERFACE__H__/**********public definition**********///打印提示符#define PROMPT {printf("/r/033[K/033[32m[command]:");fflush(stdout);}/**********type definition**********/typedef void (*FUNC)(int argc, char *argv[]);typedef struct { char *cmd_name;  //命令字符串 FUNC func_tret;  //命令执行}CMD_STRUCT;/**********funtion announce**********///命令处理int cmd_treat(char *);/*======================================//    执行命令列表========================================*/void say_cmd(int argc, char *argv[]); //聊天命令void list_cmd(int argc, char *argv[]); //列表命令void help_cmd(int argc, char *argv[]); //帮助命令void cls_cmd(int argc, char *argv[]); //清屏命令void exit_cmd(int argc, char *argv[]); //退出命令

    #endif//__USERINTERFACE__H__

    /* user_interface.c *//**********include contain**********/#include"user_interface.h"/**********standard contain**********/#include<stdio.h>//printf(), #include<stdlib.h>//exit(), atoi(), malloc(), free(), #include<string.h>//strlen(), strcpy(), strchr(), strtok(), /**********debug action**********/#define DEBUG//测试

    #ifdef DEBUG#define debug(x...) {printf("/r/033[K");printf(x);fflush(stdout);}#else#define debug(x...) #endif/**********global announce**********///命令结构数组:用来保存 命令名 和 处理函数名CMD_STRUCT cmd_list[]={     {"say",  say_cmd},  //聊天命令    {"sendto",  say_cmd},  //聊天命令    {"ls",   list_cmd},  //列表命令    {"list",  list_cmd},  //列表命令    {"help",  help_cmd},  //帮助命令    {"cls",  cls_cmd},  //清屏命令     {"clear",  cls_cmd},  //清屏命令    {"exit",  exit_cmd},  //退出     {"quit",  exit_cmd},  //退出   };//帮助菜单char *help= "********************************************/n"/   "* say/sendto : 聊天命令    */n"/   "* ls/list  : 列表命令    */n"/   "* help   : 帮助命令    */n"/   "* cls/clear : 清屏命令    */n"/   "* exit/quit : 退出命令    */n"/   "********************************************/n";/**********function achieve**********///命令处理int cmd_treat(char *cmd_buf){ char *argv[10] = {NULL}; int argc = 0; int i = 0;  //命令串为空则退出 if (strlen(cmd_buf) == 0) {  return 0; }  //用空格和制表符切割命令字符串 /***注意:此种方法受限于 *argv[] 的初始化, 必须确保此指针数组默认全NULL***/ argv[argc] = cmd_buf;//命令缓存存入第一参数指针 while ((argv[argc] = strtok(argv[argc], " /t")) != NULL) {//将命令缓存依次切割并存入参数指针  debug("argv[%d]:%s/n", argc, argv[argc]);  argc++; }  //查找执行命令 for (i=0; i<(sizeof(cmd_list)/sizeof(CMD_STRUCT)); i++) {  //查找命令  if (strcmp(cmd_list[i].cmd_name, argv[0]) == 0) {   //执行命令   cmd_list[i].func_tret(argc, argv);   return 1;  } }  return -1;}/*======================================//    执行命令列表========================================*///聊天命令void say_cmd(int argc, char *argv[]){ debug("say_cmd/n");}

    //列表命令void list_cmd(int argc, char *argv[]){ debug("list_cmd/n");}

    // 帮助命令void help_cmd(int argc, char *argv[]){ //打印帮助菜单 printf("%s", help); }

    //清屏命令void cls_cmd(int argc, char *argv[]){ debug("cls_cmd/n"); printf("/033[2J/033[0;0H");}

    //退出命令void exit_cmd(int argc, char *argv[]){ debug("exit_cmd/n"); exit(0);}

     


    最新回复(0)