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


90

我需要检查std:string是否以“ xyz”开头。我该怎么做而不搜索整个字符串或使用substr()创建临时字符串。

Answers:


164

我会使用比较方法:

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

if (s.compare(0, t.length(), t) == 0)
{
// ok
}

3
为什么不简单地使用s.compare(t)?
弗兰克·梅西拉德

5
@FranckMesirard:这是因为默认情况下,compare会尝试将传递的字符串的整个长度与成员数据进行比较,并返回false,同时给出长度,因为传递的参数的长度会使它返回true(意思是std :: basic_string ::比较,与像String.BeginsWith偏移&长度,可制成使用的()中其他库使用时。)没有偏移和长度,这不会是真实的。
legends2k 2011年

1
如果t为空,则返回true。
gliderkite 2012年

14
@gliderkite应该的是,空字符串是每个字符串的初始前缀。
Jim Balter

1
它应该是正确的...如果您想排除空字符串:if(!t.empty()&&!s.compare(0,t.length(),t))
ericcurtin

14

可能更符合标准库精神的方法是定义您自己的begins_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());
}

这为客户端代码提供了更简单的界面,并且与大多数标准库容器兼容。


凉!这应该添加到提高!
大卫

2
@David:如果boost是允许的依赖项,请参见boost :: algorithm :: starts_with —“以... 开头 ”谓词
Gabor

10

查看Boost的String Algo库,该库具有许多有用的功能,例如starts_with,istart_with(不区分大小写)等。如果您只想在项目中使用Boost库的一部分,则可以使用bcp实用程序进行复制仅需要的文件


4

似乎std :: string :: starts_with在C ++ 20内,同时可以使用std :: string :: find

std::string s1("xyzblahblah");
std::string s2("xyz")

if (s1.find(s2) == 0)
{
   // ok, s1 starts with s2
}

1
这比使用可接受的答案要好得多,std::string::compare因为它可以轻松检查字符串是否以文字开头,而无需重复文字本身来查找其大小。并感谢您指出C ++ 20直接解决方案。
Ruslan

如果s1并非以s2开头,则此后仍将尝试对其进行匹配,这不如compare()好。
A117

0

我觉得我不完全了解您的问题。看起来似乎不重要:

s[0]=='x' && s[1]=='y' && s[2]=='z'

这只会查看(最多)前三个字符。对于在编译时未知的字符串的一般化要求您将以上内容替换为循环:

// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
  if (s[i]!=t[i])
    return false;
}

好吧,我知道如何在使用C函数时比较字符串。我的问题是关于使用C ++ STL进行面向对象的方式。
jackhab

这里没有使用C函数。并且标准库并不排除您编写自己的功能。

6
如果t比s短怎么办?
vidstige 2013年

@jackhab STL的作者说:“ STL不是面向对象的。我认为面向对象与人工智能几乎是一个骗局。” - stlport.org/resources/StepanovUSA.html
吉姆·巴尔特

1
@vidstige然后,循环在遇到终止NUL时终止t
Jim Balter 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.