如何通过字符分类函数技巧判断字符串中是否包含数字?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1105个文字,预计阅读时间需要5分钟。
cpp直接使用 std::isdigit 判断 char 是否可能损坏,否则在非 ASCII 环境或负值 char 上会触发未定义行为。它接受 int,但传入 char 时若 char 是 signed 且值为负(例如某些 locale 下读到的高位字节),会触发未定义行为。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 务必先将
char转成unsigned char,再转int传给std::isdigit,例如:std::isdigit(static_cast<unsigned char>(c))</unsigned> - 别依赖全局 locale——
std::isdigit行为受当前 C locale 影响,中文 Windows 下可能把全角数字也判为 true,而你通常只想要 ASCII'0'–'9' - 如果只要 ASCII 数字,比调用
std::isdigit更快更稳的是直接比较:c >= '0' && c
遍历字符串查有没有数字:用 std::any_of 还是手写循环
std::any_of 写起来短,但默认 predicate 里不处理 unsigned char 转换,容易踩上面那个坑;手写循环反而更容易控制细节。
本文共计1105个文字,预计阅读时间需要5分钟。
cpp直接使用 std::isdigit 判断 char 是否可能损坏,否则在非 ASCII 环境或负值 char 上会触发未定义行为。它接受 int,但传入 char 时若 char 是 signed 且值为负(例如某些 locale 下读到的高位字节),会触发未定义行为。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 务必先将
char转成unsigned char,再转int传给std::isdigit,例如:std::isdigit(static_cast<unsigned char>(c))</unsigned> - 别依赖全局 locale——
std::isdigit行为受当前 C locale 影响,中文 Windows 下可能把全角数字也判为 true,而你通常只想要 ASCII'0'–'9' - 如果只要 ASCII 数字,比调用
std::isdigit更快更稳的是直接比较:c >= '0' && c
遍历字符串查有没有数字:用 std::any_of 还是手写循环
std::any_of 写起来短,但默认 predicate 里不处理 unsigned char 转换,容易踩上面那个坑;手写循环反而更容易控制细节。

