程序员人生 网站导航

进行命令处理的典型程序框架

栏目:互联网时间:2014-10-08 08:00:00
进行命令处理的典型程序框架

     今天翻看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 ", 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 ", result); break; default: printf("Invalid "); break; } //printf("CMD is %d ", i); //printf("words count : %d ", count); //最后统一释放内存 for(i = 0; i < count ; i++) free(words[i]); free(words); // }


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐