進(jìn)行命令處理的典型程序框架
來(lái)源:程序員人生 發(fā)布時(shí)間:2014-10-08 08:00:00 閱讀次數(shù):3018次
進(jìn)行命令處理的典型程序框架
今天翻看APUE中非局部goto的時(shí)候,看到了這個(gè)處理命令行的代碼框架,所以就想簡(jiǎn)單的實(shí)現(xiàn)一個(gè)功能進(jìn)行調(diào)試,花了大概2個(gè)小時(shí),才完全看的過(guò)去,記錄下,雖然看起來(lái)還是不夠?qū)哟吻逦@锩鏍砍兜降闹R(shí)點(diǎn)注意有:業(yè)務(wù)要學(xué)會(huì)分層;枚舉值和對(duì)應(yīng)字符串的轉(zhuǎn)換;字符串的解析(分詞)。
#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){
//至少有一個(gè)加數(shù),這里假設(shè)輸入時(shí)合法的
}
// C 語(yǔ)言不能用字符串做索引,所以需要找到字符串命令對(duì)應(yīng)的枚舉值
for(i = 0; i < CMD_LIMIT; i++)
if(strcmp(words[0], CMD_STRING[i]) == 0)
break;
switch(i){
case CMD_ADD:
// cmd_add 應(yīng)該單獨(dú)分離出一個(gè)函數(shù)
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);
//最后統(tǒng)一釋放內(nèi)存
for(i = 0; i < count ; i++)
free(words[i]);
free(words); //
}
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)