日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

闲云控制台(一)控制台命令解析框架

發布時間:2024/1/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 闲云控制台(一)控制台命令解析框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

公布閑云控制臺連載系列,會不定期增加新功能~

先發一個命令解析的框架

/************************************************** *******************閑云萬能控制臺********************* ********* ********* 作者: 閑云野鶴 ********* 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

總結

以上是生活随笔為你收集整理的闲云控制台(一)控制台命令解析框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。