isdigit仅识别ASCII数字'0'–'9',传入char前必须static_cast以防未定义行为,不支持Unicode、全角数字或十六进制字符。
isdigit 是 C++ 中判断字符是否为 ASCII 数字('0'–'9')最常用、最直接的函数,但它有严格的前提条件:**必须传入 unsigned char 范围内的值,或明确转换为 unsigned char 后再传入,否则对负值(如 char 为 signed 且值为 -1~−128)可能触发未定义行为。**
char 可能出错?isdigit 实际来自 C 标准库( 或 ),其参数类型是 int,但语义上只接受 unsigned char 的整数值(0–255)或 EOF(-1)。当平台默认 char 是 signed 时,比如 char c = 'ÿ';(即 -1),直接传 isdigit(c) 就等于传 isdigit(-1) —— 这在标准中属于未定义行为,可能返回任意值,甚至崩溃。
isdigit(static_cast(c))
isdigit(c)(未强制转 unsigned char)isdigit('5') 看似安全,是因为字面量 '5' 类型是 int,值为 53,无符号性问题;但变量 char c = '5'; 在 signed-char 平台仍需转换isdigit 支持哪些字符?它只识别 ASCII 十进制数字字符:'0'、'1'、…、'9'。不识别:
isxdigit
也就是

isdigit('a') 返回 false,isdigit('7') 返回 true,isdigit('½')(U+00BD)也返回 false —— 它不做 Unicode 层面的数字判定。
如果需求超出 ASCII 范围(例如处理 UTF-8 字符串中的全角数字),isdigit 不适用,需换策略:
utf8cpp)解码为 Unicode 码点,再查 std::iswdigit(需 )或 ICU 库std::isdigit(c, std::locale())(),但依赖当前 locale 设置,跨平台行为不一致,慎用bool is_ascii_digit(char c) {
return c >= '0' && c <= '9';
}该写法无类型转换风险,编译器优化后性能与 isdigit 相当,且语义清晰遇到 isdigit 行为异常(如本该返回 true 却返回 false,或程序崩溃),优先检查:
char 类型且未转 unsigned char?尤其注意从 std::string 或文件读取的 char 数据char 传入?此时每个 char 都不是 ASCII 数字,isdigit 必然返回 false
isdigit 和 std::isdigit?C++ 头文件 中的 std::isdigit 是重载函数,但仅对 int 版本做 C 兼容,其他重载(如 char)并不存在 —— 实际仍是 C 版本,仍需手动转类型最稳妥的习惯:只要用 isdigit,就写 isdigit(static_cast,哪怕看起来多余 —— 这个 cast 是防御性编程的最小成本。