kdt*_*kdt 200
只需比较最后n个字符std::string::compare:
#include <iostream>
bool hasEnding (std::string const &fullString, std::string const &ending) {
if (fullString.length() >= ending.length()) {
return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
} else {
return false;
}
}
int main () {
std::string test1 = "binary";
std::string test2 = "unary";
std::string test3 = "tertiary";
std::string test4 = "ry";
std::string ending = "nary";
std::cout << hasEnding (test1, ending) << std::endl;
std::cout << hasEnding (test2, ending) << std::endl;
std::cout << hasEnding (test3, ending) << std::endl;
std::cout << hasEnding (test4, ending) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
小智 166
使用此功能:
inline bool ends_with(std::string const & value, std::string const & ending)
{
if (ending.size() > value.size()) return false;
return std::equal(ending.rbegin(), ending.rend(), value.rbegin());
}
Run Code Online (Sandbox Code Playgroud)
And*_*ner 151
使用boost::algorithm::ends_with(参见http://www.boost.org/doc/libs/1_34_0/doc/html/boost/algorithm/ends_with.html):
#include <boost/algorithm/string/predicate.hpp>
// works with const char*
assert(boost::algorithm::ends_with("mystring", "ing"));
// also works with std::string
std::string haystack("mystring");
std::string needle("ing");
assert(boost::algorithm::ends_with(haystack, needle));
std::string haystack2("ng");
assert(! boost::algorithm::ends_with(haystack2, needle));
Run Code Online (Sandbox Code Playgroud)
Pav*_*l P 65
注意,从c ++ 20 std :: string开始最终将提供starts_with和ends_with.似乎有可能c ++中的c ++ 30字符串可能最终变得可用,如果你不是从遥远的未来读取它,你可以使用这些startsWith/endsWith:
#include <string>
static bool endsWith(const std::string& str, const std::string& suffix)
{
return str.size() >= suffix.size() && 0 == str.compare(str.size()-suffix.size(), suffix.size(), suffix);
}
static bool startsWith(const std::string& str, const std::string& prefix)
{
return str.size() >= prefix.size() && 0 == str.compare(0, prefix.size(), prefix);
}
Run Code Online (Sandbox Code Playgroud)
和一些额外的帮助重载:
static bool endsWith(const std::string& str, const char* suffix, unsigned suffixLen)
{
return str.size() >= suffixLen && 0 == str.compare(str.size()-suffixLen, suffixLen, suffix, suffixLen);
}
static bool endsWith(const std::string& str, const char* suffix)
{
return endsWith(str, suffix, std::string::traits_type::length(suffix));
}
static bool startsWith(const std::string& str, const char* prefix, unsigned prefixLen)
{
return str.size() >= prefixLen && 0 == str.compare(0, prefixLen, prefix, prefixLen);
}
static bool startsWith(const std::string& str, const char* prefix)
{
return startsWith(str, prefix, std::string::traits_type::length(prefix));
}
Run Code Online (Sandbox Code Playgroud)
IMO,c ++字符串显然功能失调,并没有在现实世界的代码中使用.但是希望这至少会变得更好.
Tom*_*Tom 39
我知道C++的问题,但是如果有人需要一个好的'老式C函数来做到这一点:
/* returns 1 iff str ends with suffix */
int str_ends_with(const char * str, const char * suffix) {
if( str == NULL || suffix == NULL )
return 0;
size_t str_len = strlen(str);
size_t suffix_len = strlen(suffix);
if(suffix_len > str_len)
return 0;
return 0 == strncmp( str + str_len - suffix_len, suffix, suffix_len );
}
xto*_*ofl 25
std::mismatch当用于从两个字符串的末尾向后迭代时,该方法可以用于此目的:
const string sNoFruit = "ThisOneEndsOnNothingMuchFruitLike";
const string sOrange = "ThisOneEndsOnOrange";
const string sPattern = "Orange";
assert( mismatch( sPattern.rbegin(), sPattern.rend(), sNoFruit.rbegin() )
.first != sPattern.rend() );
assert( mismatch( sPattern.rbegin(), sPattern.rend(), sOrange.rbegin() )
.first == sPattern.rend() );
Run Code Online (Sandbox Code Playgroud)
baz*_*rek 16
在我看来最简单的,C++解决方案是:
bool endsWith(const string& s, const string& suffix)
{
return s.rfind(suffix) == (s.size()-suffix.size());
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*rio 10
我们a是一个字符串,b您要查找的字符串.使用a.substr获得的最后n个字符a,并把它们比作B(其中n是长度b)
或使用std::equal(包括<algorithm>)
例如:
bool EndsWith(const string& a, const string& b) {
if (b.size() > a.size()) return false;
return std::equal(a.begin() + a.size() - b.size(), a.end(), b.begin());
}
Run Code Online (Sandbox Code Playgroud)
Ser*_*gei 10
使用 std::equal 算法进行<algorithms>反向迭代:
std::string LogExt = ".log";\nif (std::equal(LogExt.rbegin(), LogExt.rend(), filename.rbegin())) {\n \xe2\x80\xa6\n}\nRun Code Online (Sandbox Code Playgroud)\n从C++20开始ends_with引入。
让我用不区分大小写的版本扩展Joseph 的解决方案(在线演示)
#include <string>
#include <cctype>
static bool EndsWithCaseInsensitive(const std::string& value, const std::string& ending) {
if (ending.size() > value.size()) {
return false;
}
return std::equal(ending.crbegin(), ending.crend(), value.crbegin(),
[](const unsigned char a, const unsigned char b) {
return std::tolower(a) == std::tolower(b);
}
);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
159449 次 |
| 最近记录: |