对于C++,我知道如果两个单词都是完全小写或完全大写的话,基本的比较运算符就可以完成这个任务。我有一个字符串数组,字母可以从下到上变化。下面是我可以使用的字符串类型的一个小例子:
“富足人生”
“新生活”
“新生活大会”
我知道在Java中存在函数String.compareToIgnoreCase()。是否有与此函数等价的C++?
发布于 2015-02-07 21:12:04
我不知道标准库中有任何不区分大小写的函数,但是可以为std::equal指定一个自定义谓词。
std::string a("hello");
std::string b("HELLO");
std::cout << std::equal(a.begin(), a.end(), b.begin(),
[] (const char& a, const char& b)
{
return (std::tolower(a) == std::tolower(b));
});有关考虑区域设置的解决方案,请参阅Case insensitive std::string.find()。
#include <locale>
template<typename charT = std::string::value_type>
struct my_equal {
my_equal( const std::locale& loc ) : loc_(loc) {}
bool operator()(charT ch1, charT ch2) {
return std::toupper(ch1, loc_) == std::toupper(ch2, loc_);
}
private:
const std::locale& loc_;
};
int main()
{
std::string a("hello");
std::string b("HELLO");
std::cout << std::equal(a.begin(), a.end(), b.begin(),
my_equal<>(std::locale()));
}发布于 2015-02-07 22:00:08
是的,在C++中有一种不区分大小写的比较字符串的方法。关键是std::string是一个模板:
template <class charT,
class traits = char_traits<charT>,
class Allocator = allocator<charT>>
class basic_string;这里的traits控制着charT之间的联系。对于普通的std::string,他们会做你期望的事情,但我们可以只写我们自己的不区分大小写的特征:
struct case_insensitive_traits
: char_traits<char>
{
static bool eq(char a, char b) { return tolower(a) == tolower(b); }
static bool ne(char a, char b) { return !eq(a, b); }
static bool lt(char a, char b) { return tolower(a) < tolower(b); }
static bool gt(char a, char b) { return tolower(a) > tolower(b); }
static int compare(const char* a, const char* b, size_t n)
{
for (size_t i = 0; i < n; ++i) {
int delta = tolower(a[i]) - tolower(b[i]);
if (delta != 0) return delta;
}
return 0;
}
static const char* find(const char* s, size_t n, char c)
{
c = tolower(c);
for (size_t i = 0; i < n; ++i, ++s) {
if (tolower(*s) == c) return s;
}
return nullptr;
}
};在此基础上:
using case_insensitive_string = std::basic_string<char, case_insensitive_traits>;
case_insensitive_string a{"hello"};
case_insensitive_string b{"hElLo"};
assert(a == b);发布于 2015-02-07 22:54:00
您可以使用Boost字符串算法:
#include <string>
#include <cassert>
#include <boost/algorithm/string.hpp>
int main() {
std::string s { "Test" };
assert(boost::iequals(s, "TEST"));
}https://stackoverflow.com/questions/28387362
复制相似问题