查找string是否以C ++中的另一个string结尾

我怎样才能find一个string以C ++中的另一个string结束?

简单地比较使用std::string::compare的最后n个字符:

 #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; } 

使用这个function:

 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()); } 

使用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)); 

我知道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 ); }
/* 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 ); } 

std::mismatch方法可用于此目的,用于从两个string的末尾向后迭代:

 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() ); 

a是一个string, b是你寻找的string。 使用a.substr来获得a的最后n个字符并将它们与b进行比较(其中n是b的长度)

或者使用std::equal (include <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()); } 

在我看来最简单的是,C ++解决scheme是:

 bool endsWith(const string& s, const string& suffix) { return s.rfind(suffix) == (s.size()-suffix.size()); } 

很多奇怪的答案。 所有这些与rfind都不好。 使用boost / algorithm / string的解决scheme是可以的,但我宁愿远离提升。 std::equal是好的,但我只是保持一些string:

 #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); } 

和一些额外的帮手重载:

 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)); } 

国际海事组织,C + +string显然是function障碍,而不是用于现实世界的代码。

你可以使用string :: rfind

基于评论的完整示例:

 bool EndsWith(string &str, string& key) { size_t keylen = key.length(); size_t strlen = str.length(); if(keylen =< strlen) return string::npos != str.rfind(key,strlen - keylen, keylen); else return false; } 

关于Grzegorz Bazior的回应。 我用这个实现,但原来的一个bug(如果我比较“..”和“.so”)返回true。 我build议修改function:

 bool endsWith(const string& s, const string& suffix) { return s.size() >= suffix.size() && s.rfind(suffix) == (s.size()-suffix.size()); } 

和上面一样,这里是我的解决scheme

  template<typename TString> inline bool starts_with(const TString& str, const TString& start) { if (start.size() > str.size()) return false; return str.compare(0, start.size(), start) == 0; } template<typename TString> inline bool ends_with(const TString& str, const TString& end) { if (end.size() > str.size()) return false; return std::equal(end.rbegin(), end.rend(), str.rbegin()); } 

检查str是否有后缀 ,使用如下:

 /* Check string is end with extension/suffix */ int strEndWith(char* str, const char* suffix) { size_t strLen = strlen(str); size_t suffixLen = strlen(suffix); if (suffixLen <= strLen) { return strncmp(str + strLen - suffixLen, suffix, suffixLen) == 0; } return 0; } 

我认为这是有道理的发布一个原始的解决scheme,不使用任何库函数…

 // Checks whether `str' ends with `suffix' bool endsWith(const std::string& str, const std::string& suffix) { if (&suffix == &str) return true; // str and suffix are the same string if (suffix.length() > str.length()) return false; size_t delta = str.length() - suffix.length(); for (size_t i = 0; i < suffix.length(); ++i) { if (suffix[i] != str[delta + i]) return false; } return true; } 

添加一个简单的std::tolower可以使这个case不敏感

 // Checks whether `str' ends with `suffix' ignoring case bool endsWithIgnoreCase(const std::string& str, const std::string& suffix) { if (&suffix == &str) return true; // str and suffix are the same string if (suffix.length() > str.length()) return false; size_t delta = str.length() - suffix.length(); for (size_t i = 0; i < suffix.length(); ++i) { if (std::tolower(suffix[i]) != std::tolower(str[delta + i])) return false; } return true; }