C ++中不区分大小写的标准字符串比较

Case insensitive standard string comparison in C++

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
void
main()
{
    std::string str1 ="abracadabra";
    std::string str2 ="AbRaCaDaBra";

    if (!str1.compare(str2)) {
        cout <<"Compares"
    }
}

我怎样才能做到这一点?基本上不区分大小写。相关问题我在谷歌上搜索到了这里

http://msdn.microsoft.com/en-us/library/zkcaxw5y.aspx

有一个不区分大小写的方法字符串::compare(str1,str2,bool)。问题是这与我的工作方式有什么关系。


您可以创建一个谓词函数并在std::equals中使用它来执行比较:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool icompare_pred(unsigned char a, unsigned char b)
{
    return std::tolower(a) == std::tolower(b);
}

bool icompare(std::string const& a, std::string const& b)
{
    if (a.length()==b.length()) {
        return std::equal(b.begin(), b.end(),
                           a.begin(), icompare_pred);
    }
    else {
        return false;
    }
}

现在您只需执行以下操作:

1
2
3
if (icompare(str1, str)) {
    std::cout <<"Compares" << std::endl;
}


将两者都转换为小写,然后进行比较。

转换为下:

1
2
3
4
for(int i = 0; i < str1.size(); i++)
{
  str[i] = tolower(str[i]);
}

比较字符串:

1
if (str1.compare(str2) == 0) { ... }

零值表示两个字符串相等。

编辑

这可用于避免for循环:http://www.cplusplus.com/reference/algorithm/transform/

1
std::transform(in.begin(),in.end(),std::back_inserter(out),tolower);