C++字符串前缀后缀判断实现与优化

1. 字符串处理基础与需求分析

在C++标准库中,字符串处理功能虽然丰富,但缺少直接判断字符串前缀和后缀的便捷方法。日常开发中经常需要检查某个字符串是否以特定子串开头或结尾,比如:

  • 验证文件扩展名(".txt", ".png"等)
  • 检查URL协议("http://", "https://")
  • 路由匹配("/api/v1/"开头的请求)
  • 日志过滤(以"[ERROR]"开头的日志行)

STL的string类提供了find()、compare()等方法可以实现类似功能,但代码写起来不够直观。比如用find()检查前缀:

cpp复制if (str.find(prefix) == 0) { ... }  // 判断前缀
if (str.rfind(suffix) == str.length() - suffix.length()) { ... }  // 判断后缀

这种写法需要处理位置计算,容易出错。我们需要封装更易用的beginWith()和endWith()函数,让代码可读性更好:

cpp复制if (beginWith(str, "https://")) { ... }
if (endWith(filename, ".jpg")) { ... }

需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。

2. 函数实现方案对比

2.1 基于string::compare的实现

最直接的实现方式是使用string的compare()方法:

cpp复制bool beginWith(const std::string& str, const std::string& prefix) {
    return str.size() >= prefix.size() && 
           str.compare(0, prefix.size(), prefix) == 0;
}

bool endWith(const std::string& str, const std::string& suffix) {
    return str.size() >= suffix.size() && 
           str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0;
}

优点:

  • 直接使用STL接口,无额外依赖
  • compare()做了优化,性能较好

缺点:

  • 需要手动检查字符串长度
  • compare()的接口参数较多,新手容易用错

2.2 基于string_view的现代C++实现

C++17引入的string_view可以避免不必要的字符串拷贝:

cpp复制bool beginWith(std::string_view str, std::string_view prefix) {
    return str.size() >= prefix.size() && 
           str.substr(0, prefix.siz

内容推荐

已经到底了哦
已经到底了哦