最推荐使用 std::string::compare(0, prefix.length(), prefix) == 0 判断前缀,因其自动处理长度不足、安全高效;c++20 起可用 starts_with();substr() 易越界需手动检查长度;utf-8 场景需注意字节与 unicode 边界。

用 substr() 判断前缀时要注意越界
直接调用 substr(0, n) 比较最直观,但前提是字符串长度 ≥ n。否则 substr() 会抛出 std::out_of_range 异常。
- 先检查
str.length() >= prefix.length(),再取子串 - 或者用更安全的写法:
str.compare(0, prefix.length(), prefix) == 0——compare()内部自动处理长度不足的情况,不会崩溃 - 注意
compare()返回 0 表示匹配,不是布尔值
starts_with() 在 C++20 中最简洁,但编译器得支持
如果你用的是 GCC 10+、Clang 10+ 或 MSVC 2019 16.10+,可以直接用 std::string::starts_with():
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
if (str.starts_with("http")) { ... }
- 它接受
std::string_view、C 字符串、单字符,无需手动计算长度 - 不支持 C++17 及更早标准;若项目需兼容旧标准,不能直接用
- 对
std::string_view同样有效,且零开销
手写循环比调用函数更快?通常没必要
有人为“性能”手动遍历比较前几个字符,但现代标准库实现(尤其是 compare() 和 starts_with())基本都做了短路和内联优化,实际差异微乎其微。
- 除非你在嵌入式环境或极端性能敏感场景,否则别过早优化
- 手写容易漏掉空字符串、大小写、编码边界等细节
- 如果真要区分大小写,记得用
std::equal配合std::tolower,而不是直接字符比较
处理 UTF-8 字符串前缀要格外小心
std::string 是字节容器,starts_with("café") 看似正常,但若字符串含非 ASCII 字符,按字节比较可能切在 UTF-8 多字节序列中间,导致误判或崩溃。
- 标准库所有前缀函数都按字节操作,不感知 Unicode
- 真正需要 Unicode 前缀判断时,必须先用 ICU、utf8cpp 或 C++20 的
std::text_encoding(尚未普及)做合法 code point 对齐 - 多数配置文件、协议头(如 HTTP header)、路径前缀场景中,UTF-8 字面量本身是稳定的,可直接用
starts_with()—— 只要确保输入和前缀编码一致
compare() 是最简、最稳、最通用的选择,而非 substr()。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










