最直接的方法是使用C++20的std::string::starts_with(),它接受string_view、const char*或char,区分大小写,空字符串返回true;旧标准需先检查长度再substr比较以防越界。

用 std::string::starts_with()(C++20)最直接
如果你的编译器支持 C++20(如 GCC 10+、Clang 10+、MSVC 2019 16.10+),starts_with() 是专为此设计的成员函数,语义清晰、性能好、无歧义。
它接受 std::string_view、const char* 或单个 char,返回 bool:
std::string s = "hello world";
if (s.starts_with("hello")) { /* true */ }
if (s.starts_with("HELLO")) { /* false,区分大小写 */ }
- 不修改原字符串,也不分配内存
- 底层通常做指针比较 + 循环字符比对,O(n) 最坏但常数极小
- 注意:传入空字符串
""总是返回true(符合标准定义)
兼容 C++11/14/17:用 substr() + == 要加长度判断
老标准下常见写法是取前缀再比较,但容易漏掉越界——s.substr(0, prefix.size()) 在 prefix.size() > s.size() 时会抛 std::out_of_range。
安全写法必须先检查长度:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
std::string s = "abc";
std::string prefix = "abcd";
if (prefix.size() <= s.size() && s.substr(0, prefix.size()) == prefix) {
// 安全
}
- 不要省略
prefix.size() 判断,否则线上可能 crash -
substr()会拷贝子串,小字符串影响不大,高频调用时有额外开销 - 如果
prefix是字面量(如"http"),可用sizeof("http") - 1避免运行时算长度
想忽略大小写?别手写循环,用 std::equal() + std::tolower
C++ 标准库没提供大小写无关的 starts_with,但可以用 std::equal 配合自定义谓词,比手写 for 更可靠:
std::string s = "Hello World";
std::string prefix = "HELLO";
if (prefix.size() <= s.size() &&
std::equal(prefix.begin(), prefix.end(), s.begin(),
[](char a, char b) { return std::tolower(a) == std::tolower(b); })) {
// true
}
- 同样要前置长度检查,否则
s.begin() + prefix.size()可能越界 - 注意
std::tolower对char传入需转为unsigned char防止负值 UB(实际中多数 locale 下可忽略,但严谨起见建议 cast) - 避免用
std::transform先转全小写再比较——浪费内存和时间
第三方或跨平台?小心 boost::algorithm::starts_with() 的默认行为
Boost 提供了 boost::algorithm::starts_with(),但默认**区分大小写**,且不检查空指针(若传 const char* 且为 nullptr 会崩溃)。
- 使用前确保参数非空,尤其从 C API 接收字符串时
- 大小写不敏感需显式传谓词:
boost::algorithm::iequals不适用,得用boost::algorithm::starts_with(s, prefix, boost::is_iequal()) - 引入 Boost 带来构建复杂度,简单项目不如手写几行
std::equal
C++ 字符串前缀判断看似简单,但边界条件(空串、越界、大小写、编码)一多,就容易在深夜调试时发现某个分支没覆盖。最稳妥的做法是:C++20 以上无脑用 starts_with();老标准就封装一个带长度检查的内联函数,别重复写三行判断。

















