如何用switch-case简洁匹配C/C++中全部大小写字母?
用Switch简洁匹配字母范围的方案
标准C++兼容写法(无编译器依赖)
标准C++没有提供case直接匹配字符范围的语法,推荐结合switch和if平衡简洁性与兼容性,有两种实用思路:
思路1:switch处理单个字符,default分支处理字母范围
把所有单个值的判断放在switch的case中,字母范围逻辑统一放在default分支:
int token; switch (token) { case '\n': // 处理换行逻辑 break; case '^': // 处理^的逻辑 break; case '&': // 处理&的逻辑 break; default: // 匹配大小写字母 if ((token >= 'a' && token <= 'z') || (token >= 'A' && token <= 'Z')) { // 处理字母的逻辑 } else { // 处理其他未匹配字符的逻辑 } break; }
思路2:先单独处理字母,再用switch处理其他单个值
如果字母相关逻辑代码量较大,可先独立处理字母,剩余单个值用switch统一匹配:
int token; if ((token >= 'a' && token <= 'z') || (token >= 'A' && token <= 'Z')) { // 处理字母的逻辑 } else { switch (token) { case '\n': // 处理换行逻辑 break; case '^': // 处理^的逻辑 break; case '&': // 处理&的逻辑 break; default: // 处理其他未匹配字符的逻辑 break; } }
编译器扩展写法(简洁但有移植性限制)
GCC、Clang等编译器支持非标准的case范围语法(case 'a'...'z'),可先将字符转为小写(或大写),再用范围case匹配:
#include <cctype> int token; // 转为小写,先转成unsigned char避免符号问题 char lower_token = std::tolower(static_cast<unsigned char>(token)); switch (lower_token) { case 'a'...'z': // 仅GCC/Clang支持,非标准C++ // 处理所有大小写字母的逻辑 break; case '\n': // 处理换行逻辑 break; case '^': // 处理^的逻辑 break; case '&': // 处理&的逻辑 break; default: // 处理其他未匹配字符的逻辑 break; }
这种写法最简洁,但如果代码需要跨编译器移植(比如兼容MSVC),不建议使用。
内容的提问来源于stack exchange,提问作者Ne C
相关产品推荐
相关产品推荐

