头文件提供isupper()和islower()函数,按ascii规则判断单个字符大小写;传入前须转为unsigned char以防未定义行为;也可直接比较字符范围如c>='a'&&c

用 isupper() 和 islower() 最直接
标准库头文件 <cctype></cctype> 提供了两个函数:对单个 unsigned char 值(或能提升为该类型的 int)判断大小写。它们不依赖 locale,只按 ASCII 规则工作(即 'A'–'Z' 返回 true,'a'–'z' 同理),这是绝大多数入门场景需要的行为。
注意:传入负值(如 char c = '\xFF'; 直接传给 isupper(c))会导致未定义行为——因为 char 可能是 signed,而函数期望的是非负整数。安全写法是先转成 unsigned char:
char c = 'A';
if (isupper(static_cast<unsigned char>(c))) { /* ... */ }自己写判断逻辑也简单,但要注意范围
如果不想引入 <cctype></cctype>,或者想显式控制逻辑,可以直接比较字符范围:
c >= 'A' && c 判断大写c >= 'a' && c 判断小写
这种写法在 ASCII 环境下完全可靠,且编译器通常能优化成单条比较指令。但要注意:它不适用于 EBCDIC 或其他编码;也不处理 Unicode 字符(C++ 的 char 本身就不代表 Unicode 字符)。
立即学习“C++免费学习笔记(深入)”;
别用 std::toupper()/std::tolower() 来判断
有人会想“把字符转大写再跟原字符比,不一样就是小写”,这是错的思路:
-
toupper('1')返回 '1',但 '1' 显然不是字母 -
toupper('\0')返回 '\0',同样无法区分是否为字母 - 这些函数对非字母字符返回原值,不能反推字符类型
真正想检查“是否为字母”,应该用 isalpha();大小写判断必须用 isupper()/islower() 或显式范围比较。
宽字符和 Unicode 场景要换一套工具
如果处理的是 wchar_t 或 UTF-8 字符串,<cctype></cctype> 的函数基本失效(它们只认单字节)。此时需:
- 对
wchar_t:用std::iswupper()/std::iswlower()(来自<cwctype></cwctype>),并确保当前 locale 支持所需字符集 - 对 UTF-8:先解码出 Unicode 码点(如用
std::mbrtoc8或第三方库),再查 Unicode 属性——C++20 的<charconv></charconv>不管这事,得靠utf8cpp或icu
入门阶段几乎不会碰到这个层级,但一旦开始读文件或处理用户输入,就容易掉进“为什么中文或德语变音符号判断失败”的坑里。











