首页 > 代码库 > 进行命令处理的典型程序框架
进行命令处理的典型程序框架
进行命令处理的典型程序框架
今天翻看APUE中非局部goto的时候,看到了这个处理命令行的代码框架,所以就想简单的实现一个功能进行调试,花了大概2个小时,才完全看的过去,记录下,虽然看起来还是不够层次清晰。里面牵扯到的知识点注意有:业务要学会分层;枚举值和对应字符串的转换;字符串的解析(分词)。
#include "util.h" void do_line(char *); #define FOREACH_CMD(CMD) CMD(CMD_UNSPEC) CMD(CMD_ADD) CMD(CMD_SUB) CMD(CMD_MULTI) CMD(CMD_LIMIT) #define GENERATE_ENUM(ENUM) ENUM, #define GENERATE_STRING(STRING) #STRING, enum CMD_ENUM { FOREACH_CMD(GENERATE_ENUM) }; static const char *CMD_STRING[] = { FOREACH_CMD(GENERATE_STRING) }; int main(void){ char line[MAXLINE]; //printf("%s\n", CMD_STRING[CMD_ADD]); if (fgets(line, MAXLINE, stdin) != NULL) do_line(line); exit(0); } void do_line(char *ptr) /* process one line of input */ { int cmd, i; int count , result = 0; char **words = tokenize(ptr, &count); if(count < 2){ //至少有一个加数,这里假设输入时合法的 } // C 语言不能用字符串做索引,所以需要找到字符串命令对应的枚举值 for(i = 0; i < CMD_LIMIT; i++) if(strcmp(words[0], CMD_STRING[i]) == 0) break; switch(i){ case CMD_ADD: // cmd_add 应该单独分离出一个函数 for(i = 1; i < count ; i++){ result += atoi(words[i]); } printf("ADD Result is %d\n", result); break; default: printf("Invalid\n"); break; } //printf("CMD is %d\n", i); //printf("words count : %d\n", count); //最后统一释放内存 for(i = 0; i < count ; i++) free(words[i]); free(words); // }
进行命令处理的典型程序框架
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。