在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)
| 归档时间: |
|
| 查看次数: |
66855 次 |
| 最近记录: |