在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)
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_with
和ends_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
.
要优化一点:
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>
使用 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)