你的浏览器不支持canvas

C语言使用表驱动法重构if-else分支太多的情况

Date: Author: zhangn

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自zhangn的云笔记

今天工作中遇到这么一个情况:将25种字符串分成17类,然后统计每一类中的数量

第一版代码简单粗暴,直接上if-else,代码如下

if (strcasestr(str, "a")
{
	type = 0;
}
else if (strcasestr(str, "b")
{
	type = 1;
}
else if (strcasestr(str, "c")
{
	type = 2;
}

类似于这种,当我写到第5个分支的时候就写不下去了,何况是25个,果断放弃。
那用什么方法代替if-else呢?以前写C艹倒是有种设计模式可以解决这个问题,可在纯C里玩这么玩,代码只会更加难以维护。
那么有没有适用于纯C的解决方案呢?请教了一下百度大神,原来还有表驱动法可以很优雅的解决if-else分支太多的问题。
表驱动法简单说就是将要判断的数据存到一个数组里,然后从这个数组里查询满足条件的数据。最简单的办法就是将数据和数组的索引进行绑定,但局限性比较大,我遇到的情况不适用。既然不能和索引进行绑定,那就只能自己做数据映射,然后用循环替换掉判断,遍历数组,依次判断元素是否满足条件,首先定义全局绑定数据结构和全局的只读数组

typedef struct st_type_ {
	int type;
	char *str;
}st_type;

static const st_type gTabtype[] = {
	{1, "a"},	{2, "b"},	{2, "c"},	{3, "d"}, ...., {0, NULL}
};

然后是在函数中使用

int index = 0;
int type = -1;
while (gTabtype[index].str)
{
	if (strcasestr(str, gTabtype[index].str))
	{
		type = gTabtype[index].type;
		break;
	}
	++index;
}

if (type < 0)
	return 0;

这样的代码看起来就整洁多了,也更好维护。


对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。