如何精简含大量if语句的ASCII状态表标记C语言代码?
代码精简方案
这里提供两种优化方向,第一种是完全重构逻辑的最优方案,第二种是保留你原有分支判断思路的优化方案。
最优方案:直接遍历字符集常量
你定义的ALFA/DIGITS等常量本身就是以\0结尾的字符数组,直接遍历数组里的每个字符做标记即可,完全不需要写任何分支和硬编码ASCII值,代码可以精简到10行以内:
void mark_cells(int row, int _table[][MAX_COLUMNS], const char columns[], int state) { // 转unsigned char避免char为有符号类型时下标越界 for (int i = 0; columns[i] != '\0'; i++) { _table[row][(unsigned char)columns[i]] = state; } }
这个方案的优势非常明显:
- 彻底删除所有if-else分支,代码量减少90%以上
- 不需要硬编码任何ASCII数值,可读性和可维护性大幅提升
- 完全通用,后续新增任意字符集常量都不需要修改这个函数的代码
- 自动修复你原有代码的bug:你原来的
SPACES分支只标记了空格ASCII 32,漏掉了常量里定义的\t/\n/\0三个字符,新方案会自动处理所有字符。
保留原有分支思路的优化方案
如果你一定要保留原有通过指针匹配字符集常量的实现逻辑,可以提取公共的区间标记函数来消除重复的for循环代码:
// 提取公共的区间标记辅助函数 static void mark_range(int row, int _table[][MAX_COLUMNS], int start, int end, int state) { for (int i = start; i <= end; i++) { _table[row][i] = state; } } void mark_cells(int row, int _table[][MAX_COLUMNS], const char columns[], int state) { if (columns == ALFA) { mark_range(row, _table, 65, 90, state); mark_range(row, _table, 97, 122, state); } else if (columns == DIGITS) { mark_range(row, _table, 48, 57, state); } else if (columns == OPERATORS) { mark_range(row, _table, 60, 62, state); mark_range(row, _table, 40, 43, state); mark_range(row, _table, 123, 125, state); mark_range(row, _table, 33, 33, state); mark_range(row, _table, 37, 37, state); mark_range(row, _table, 38, 38, state); mark_range(row, _table, 45, 45, state); } else if (columns == SPACES) { mark_range(row, _table, 32, 32, state); // 补全SPACES里的其他三个字符 mark_range(row, _table, '\t', '\t', state); mark_range(row, _table, '\n', '\n', state); mark_range(row, _table, '\0', '\0', state); } else if (columns == PUNC) { mark_range(row, _table, 58, 59, state); mark_range(row, _table, 63, 63, state); mark_range(row, _table, 39, 39, state); mark_range(row, _table, 46, 46, state); mark_range(row, _table, 126, 126, state); mark_range(row, _table, 33, 33, state); mark_range(row, _table, 96, 96, state); mark_range(row, _table, 44, 44, state); mark_range(row, _table, 45, 45, state); } }
内容的提问来源于stack exchange,提问作者TeachMeTWz
相关产品推荐
相关产品推荐

