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

本文详细介绍了如何使用C语言处理命令行输入,并通过枚举和字符串转换实现命令识别和执行,包括加法运算演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

     今天翻看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);  //
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值