公布闲云控制台连载系列,会不定期增加新功能~

先发一个命令解析的框架

/**************************************************
*******************闲云万能控制台*********************
*********
*********    作者: 闲云野鹤
*********     QQ: 836663997
*********    QQ群: 116920287  欢迎加入
*********    邮箱: xianyun1230@163.com
*********    博客: blog.csdn.net/xianyun2009
*********
*********  功能会一直更新。
***************************************************/
#define _CRT_SECURE_NO_WARNINGS //vs中关闭安全开发周期(SDL)检測#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <memory.h>
#include <conio.h>/***定义控制台的支持能力***/
#define MAX_CMD         100     //支持命令的最大数目
#define LEN_CMD         50      //命令中名称的最大的长度
#define LEN_ARGU        50      //命令中參数的最大的长度
#define LEN_OBJ         900     //命令中命令对象的最大的长度
#define LEN_SUMMARY     100     //命令简单介绍长度/***用于处理区返回运行状态***/
#define OVER_CMD        5       //命令名称太长
#define OVER_ARGU       6       //命令參数太长
#define OVER_OBJ        7       //命令对象太长/***用于运行区命令返回运行状态***/
#define NO              0       //运行失败
#define OK              1       //运行成功
#define ERR_NOCMD       2       //命令错误
#define ERR_ARGU        3       //參数错误
#define ERR_NOOBJ       4       //对象错误typedef struct //输入命令的结构
{char Cmd_Name[LEN_CMD + 1];           //命令名称char Cmd_Arguments[LEN_ARGU + 1];    //參数列表char Cmd_Object[LEN_OBJ + 1];        //命令对象
}Command, *pCommand;typedef int (*CMD_FUN)(pCommand);typedef struct //命令结构,存放支持的命令
{char Cmd_Name[LEN_CMD];            //命令名称CMD_FUN _Fun;                 //处理函数char Cmd_Summary[LEN_SUMMARY];
}CMD_ITEM, *pCMD_ITEM;
CMD_ITEM KEEP_CMD[MAX_CMD] = { 0 };    //用于存放注冊命令
unsigned int CUR_CMD_NUM = 0;      //当前已注冊命令数目/***********************************
***处理命令***************************进行转换和分发命令****************
************************************/
/***转换命令***/
int Translate_Command(char* _cmd_str, pCommand _cmd)
{memset(_cmd, 0, sizeof(Command));  //_cmd所有置0while ('\0' != *_cmd_str && isspace(*_cmd_str))    //清除命令两端空格类字符++_cmd_str;int _len = strlen(_cmd_str) - 1;while (_len >= 0 && isspace(*(_cmd_str + _len)))*(_cmd_str + _len--) = '\0';//切割命令char* p_str = strchr(_cmd_str, ' ');if (!p_str){if (_len + 1 > LEN_CMD)    //命令名称太长return OVER_CMD;strcpy(_cmd->Cmd_Name, _cmd_str);    //分离命令名称}else{if (p_str - _cmd_str > LEN_CMD)    //命令名称太长return OVER_CMD;strncpy(_cmd->Cmd_Name, _cmd_str, p_str - _cmd_str); //分离命令名称while ('\0' != *p_str && isspace(*p_str))++p_str;if ('-' == *p_str)    //检測參数标识'-'{++p_str;char* p_space = strchr(p_str, ' ');if (p_space){if (p_space - p_str > LEN_ARGU)   //命令參数太长return OVER_ARGU;strncpy(_cmd->Cmd_Arguments, p_str, p_space - p_str);   //分离參数while ('\0' != p_space && isspace(*p_space))++p_space;if (strlen(p_space) > LEN_OBJ)  //命令对象太长return OVER_OBJ;strcpy(_cmd->Cmd_Object, p_space);   //分离命令对象}else{if (strlen(p_str) > LEN_ARGU)  //命令參数太长return OVER_ARGU;strcpy(_cmd->Cmd_Arguments, p_str); //分离參数}}else{if (strlen(p_str) > LEN_OBJ)    //命令对象太长return OVER_OBJ;strcpy(_cmd->Cmd_Object, p_str); //分离命令对象}}return OK;
}
/***检验命令是否已注冊并返回指针***/
const pCMD_ITEM Loc_Command(pCommand _cmd)
{unsigned int i;for (i = 0; i < CUR_CMD_NUM; ++i){if (0 == strcmp(_cmd->Cmd_Name, KEEP_CMD[i].Cmd_Name))return &KEEP_CMD[i];}return NULL; //无此命令
}
/***分发命令***/
int Dispatch_Command(pCommand _cmd)
{//printf("Dispatch command:%s<-\targu:%s<-\tobj:%s<-\n", _cmd->Cmd_Name, _cmd->Cmd_Arguments, _cmd->Cmd_Object);const pCMD_ITEM ploc = Loc_Command(_cmd);if (NULL == ploc)return ERR_NOCMD;return ploc->_Fun(_cmd);
}
/****************************************
***命令处理区命令的运行区,对每一个命令进行各自的处理****需不断加入功能****每一个函数格式都应为int NAME(pCommand );NAME为函数名注意:!每一个函数都应返回一个运行状态。状态具体内容见上方'运行区命令返回状态'!
****************************************/
int Hello(pCommand b)
{printf("\t\t欢迎来到闲云万能控制台!\n\t   Welcome to xianyun Super Console!\n");return OK;
}
int Help(pCommand b)
{Hello(b);printf("\n");printf("    命令\t\t简单介绍\n");int i;for (i = 0; i < CUR_CMD_NUM; i++){printf("    %s\t\t%s\n", KEEP_CMD[i].Cmd_Name, KEEP_CMD[i].Cmd_Summary);}printf("\n    命令格式: 命令名称 [-參数] [对象]  比如:help -arv hello  參数和对象可省略\n");printf("    注意參数中每一个字符都算作一个一个參数,即样例中有三个參数a、r、v\n");return OK;
}/**********************************************
***注冊区每一个命令都应在这里注冊********************每一个在命令处理区定义的命令都应仿照_register_one_cmd("命令名称", 映射函数名称, "功能简单介绍");格式在以下注冊。否则将无法识别注意: 命令名称大写和小写敏感!

***********************************************/ void _register_one_cmd(char* _cmd_name, CMD_FUN _fun, char* _cmd_summary); void Register_Cmd() { _register_one_cmd("hello", Hello, "显示欢迎信息"); _register_one_cmd("help", Help, "显示帮助信息"); } void _register_one_cmd(char* _cmd_name, CMD_FUN _fun, char* _cmd_summary) { strcpy(KEEP_CMD[CUR_CMD_NUM].Cmd_Name, _cmd_name); strcpy(KEEP_CMD[CUR_CMD_NUM].Cmd_Summary, _cmd_summary); KEEP_CMD[CUR_CMD_NUM]._Fun = _fun; ++CUR_CMD_NUM; } /********************************************** ***信息提示区 用于各种错误、返回值的处理和交互 ***********************************************/ void ResultVal_Deal(int re) { switch (re) { case OK: return; case NO: printf("命令未能成功运行,请检測您的指令是否正确!\n"); return; case ERR_NOCMD: printf("命令无法识别!\n"); return; case ERR_ARGU: printf("命令參数错误!\n"); return; case ERR_NOOBJ: printf("命令对象错误!\n"); return; case OVER_CMD: printf("命令名称太长!\n"); return; case OVER_ARGU: printf("命令參数太长!\n"); return; case OVER_OBJ: printf("命令对象太长!

\n"); return; } } int main() { char cmd_str[1024]; int result = 0; Command _cmd; Register_Cmd(); Help(&_cmd); while (1) { printf(">"); gets(cmd_str); result = Translate_Command(cmd_str, &_cmd); ResultVal_Deal(result); if (OK == result) { result = Dispatch_Command(&_cmd); ResultVal_Deal(result); } } return 0; }

转载于:https://www.cnblogs.com/mfmdaoyou/p/6719588.html

闲云控制台(一)控制台命令解析框架相关推荐

  1. 【Java开发】命令解析框架CommandX

    雏形代码结构 主要涉及到命令的分发,解析,数据报文的解析 public abstract class BaseProcessor<T> implements CommandHandler ...

  2. 解析IOS控制台利用GDB命令查看报错堆栈

    解析IOS控制台利用GDB命令查看报错堆栈是本文要介绍的内容,在ios开发中,如果提前释放一个指针的内存,在以后还继续使用这个指针,那么程序会立刻crash掉,而且很难有报错信息,我以前都是靠猜测去判 ...

  3. RT-Thread FinSH控制台添加自定义msh命令原理

    FinSH 是 RT-Thread 的命令行组件,提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息.它可以使用串口 / 以太网 / USB 等与 PC 机进行通信. FinSH 提供了 ...

  4. 帝国霸业服务器无限加载,帝国霸业银河生存控制台的服务器命令是什么_控制台服务器命令一览_3DM单机...

    <帝国霸业:银河生存>中控制台的服务器命令是非常厉害的,很多玩家都不太清楚这些命令到底怎么样,今天小编就给大家带来玩家"星耀灬橙花"分享的控制台服务器命令一览,希望能对 ...

  5. SylixOS DSP upgrade命令解析

    SylixOS DSP upgrade命令解析 --SylixOS DSP6678平台下升级BSP 一.适用范围 本升级方案,针对TI官方评估板(TMDSEVM6678LE),主要介绍如何将Sylix ...

  6. bat使用命令解析-详细(转)

    bat命令解析 目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1.REM 和 :: 2.ECHO 和 @ 3.PAUSE 4.ERRORLEVEL 5.TITLE 6.COLOR 7.mo ...

  7. java 数学公式解析框架有哪些_开源工具 | 推荐几个Gitee火热Java项目

    openEA开源周刊 openEA开源社区的官方运营载体 这里每天给大家呈现有价值的开源资讯,欢迎您的来稿与推荐,点击上方蓝色字,加入我们吧! 摘要:OkHttps 是近期开源的对 OkHttp3 轻 ...

  8. virsh的详细命令解析

    virsh的详细命令解析 virsh 有命令模式和交互模式如果直接在vrish后面添加参数是命令模式,如果直接写virsh,就会进入交互模式 virsh list 列出所有的虚拟机,虚拟机的状态有(8 ...

  9. 自定义协议的命令解析器

    文章目录 前言 Switch...case类型命令解析的弊端 程序的改进目标 对命令解析器的分析 命令解析器的代码示例 用于代码工程需要解决的问题 可用于代码工程的命令解析器实现 一些新的认识 前言 ...

最新文章

  1. Qt中 QString 和int,double等的转换
  2. 在Android设备部署PyTorch模型
  3. 力荐联邦学习系统,据说英伟达Clara“上架”新进展!
  4. 快速卷积与快速相关——MATLAB
  5. 【kafka】kafka 判断消费组死掉方案 group dead
  6. Private Bytes,Working Set,Virtual Size的区别
  7. H3CNE概念思维导图
  8. 仿秒拍视频网UI主题模板+Emlog内核开发
  9. 代码写的太烂了,所以我干不下去了
  10. 小写金额转为中文大写
  11. 【图床】图床、PicGo进行图片管理与上传
  12. 洛阳中考实验计算机分数,2018洛阳中考科目及分值
  13. 解析JPEG文件的GPS信息
  14. 电脑录屏软件哪个好用?3款屏幕录制大师分享!
  15. 2022-2027年中国合成纤维行业市场全景评估及发展战略规划报告
  16. 人工智能如何实现两难抉择?
  17. gdpr数据处理_关于GDPR下数据同意的知识
  18. 商城学习01(踏坑)
  19. 求数组中满足要求的元素和
  20. jquery日历插件,可自定义日期内容

热门文章

  1. Linux Ubantu 常用指令
  2. 【Web技术】913- 谈谈你对前端路由的理解
  3. 远端branch和tag同名的时候,删除方法
  4. Java---抽象类
  5. 三服务 | 浙江省委信息化管理中心领导参观走访世平信息
  6. 一种手机信息窃取方式的研究
  7. 软件测试(用例Ⅰ)· 测试用例的基本概念 · 万能公式 · 设计测试用例的方法(等价类、边界值、判定表法、正交法、场景设计法、错误猜测法)
  8. Vue组件间通信的几种方式
  9. Linux命令之dhclient
  10. dhclient 卡死