std :: string比较(检查字符串是否以另一个字符串开头)

jac*_*hab 90 c++ string stl compare

我需要检查std:字符串是否以"xyz"开头.如何在不搜索整个字符串或使用substr()创建临时字符串的情况下执行此操作.

Wac*_*cek 163

我会用比较方法:

std::string s("xyzblahblah");
std::string t("xyz")

if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Run Code Online (Sandbox Code Playgroud)

  • @gliderkite因为它应该......空字符串是每个字符串的初始前缀. (14认同)
  • @FranckMesirard:那是因为默认情况下_compare_会尝试将传递的字符串的整个长度与成员数据进行比较并返回false,而将长度作为传递参数的长度将使其返回true(意味着_std :: basic_string :: compare_,当与offset和length一起使用时,可以在其他库中使用类似String.BeginsWith().)没有偏移和长度,这不是真的. (5认同)
  • 你为什么不简单地使用s.compare(t)? (3认同)

Neu*_*ino 13

一种可能更符合标准库精神的方法是定义自己的begin_with算法.

#include <algorithm>
using namespace std;


template<class TContainer>
bool begins_with(const TContainer& input, const TContainer& match)
{
    return input.size() >= match.size()
        && equal(match.begin(), match.end(), input.begin());
}
Run Code Online (Sandbox Code Playgroud)

这为客户端代码提供了更简单的接口,并与大多数标准库容器兼容.

  • @David:如果boost是允许的依赖项,请参阅boost :: algorithm :: [starts_with](http://www.boost.org/doc/libs/1_65_1/doc/html/boost/algorithm/starts_with.html) - '以'谓词开头 (2认同)

Ale*_*Ott 10

查看Boost的String Algo库,它具有许多有用的功能,例如starts_with,istart_with(不区分大小写)等.如果您只想在项目中使用部分boost库,那么您可以使用bcp实用程序来复制只需要文件