如何在C++中检查字符串start

suf*_*que 51 c++ string

在C++中是否有任何方法可以检查字符串是否以某个字符串开头(小于原始字符串)?就像我们可以用Java做的那样

bigString.startswith(smallString);
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 83

std::string s("Hello world");

if (s.find("Hello") == 0)
{
    std::cout << "String starts with Hello\n";
}
Run Code Online (Sandbox Code Playgroud)

  • @sufyansiddique简单,是的.有效,不是很好.如果`smallString`不长于`bigString`,你只需比较第一个`smallString.size()`字符来知道答案; 你不必在整个`bigString`中搜索除了初始位置之外的`smallString`. (14认同)
  • 一个有效的解决方案应该是`O(min(bigString.length(),smallString.length()))` (5认同)
  • 我认为正则表达式对于这样一个简单的检查是一个糟糕的选择,请参阅我的回答,我认为这是一个有效的解决方案.或者更好的是Alan Stokes用string :: compare()回复. (3认同)
  • 正如其他人评论说,这不可能是一个非常有效的主意,如果你要搜索的字符串是很长的,你要查找的字符串是非常短的.当你只对开头的位感兴趣时,为什么要遍历整个字符串? (2认同)

Ala*_*kes 64

你可以这样做string::compare(),它提供了各种选项来比较两个字符串的全部或部分.此版本smallString与适当的大小前缀进行比较bigString(如果bigString小于,则可正常工作smallString):

bigString.compare(0, smallString.length(), smallString) == 0
Run Code Online (Sandbox Code Playgroud)

我倾向于将它包装在一个名为的自由函数中startsWith(),否则它看起来有点神秘.

UPDATE:C++ 20添加新的starts_withends_with功能,所以你将最终能够只写bigString.starts_with(smallString).


Kle*_*ist 30

这些方法使用string::find()string::substr()不是最佳的,因为它们要么创建字符串的副本,要么在字符串的开头搜索多个匹配项.在您的情况下可能不是问题,但如果是,您可以使用该std::equal算法.记得要检查"干草堆"是否至少和"针"一样长.

#include <string>    

using namespace std;

bool startsWith(const string& haystack, const string& needle) {
    return needle.length() <= haystack.length() 
        && equal(needle.begin(), needle.end(), haystack.begin());
}
Run Code Online (Sandbox Code Playgroud)


ava*_*kar 14

正如往常一样,正确的解决方案来自Boost : boost::algorithm::starts_with.

  • 不是每个人都使用提升 要下载它,将它放在存储库中只是为了使用starts_with()有点夸大其词.也许你应该考虑删除"正确的解决方案,一如既往......".它既不"正确"也不"永远". (40认同)
  • 使用boost只是为了完成这个简单的任务. (15认同)
  • 同意Borzh.并非所有项目都使用boost(远离它),因此'always'和'correct'字样不属于此处.将这种怪物添加到STL或简单strcmp可行的项目中是疯狂的. (9认同)
  • @Borzh,当然,您已经在项目中大量使用了Boost,为什么不这样做呢? (2认同)

Bor*_*rzh 5

要优化一点:

if ( smallString.size() <= bigString.size() &&
     strncmp( smallString.c_str(), bigString.c_str(), smallString.length() ) == 0 )
Run Code Online (Sandbox Code Playgroud)

别忘了#include <cstring>#include <string.h>


Roi*_*ton 5

使用 C++20,您可以使用std::basic_string::starts_with(或std::basic_string_view::starts_with):

#include <string_view>

std::string_view bigString_v("Winter is gone"); // std::string_view avoids the copy in substr below.
std::string_view smallString_v("Winter");
if (bigString_v.starts_with(smallString_v))
{
    std::cout << "Westeros" << bigString_v.substr(smallString_v.size());
}
Run Code Online (Sandbox Code Playgroud)