【问题标题】:Case insensitive standard string comparison in C++ [duplicate]C ++中不区分大小写的标准字符串比较[重复]
【发布时间】:2014-07-19 13:43:41
【问题描述】:
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

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

【问题讨论】:

  • 谢谢,但他们在那里使用了 boost。我的问题是有没有办法在不使用 boost 的情况下完成上述工作? str1.compare(str2) 有效,它的逻辑扩展是支持不区分大小写。有没有简单易行的出路?
  • 大卫,你的例子看起来很有吸引力。我可能会使用它。谢谢
  • 您提供的链接是一个 .NET 函数,它明显不是标准 C++ 的一部分,并且与它没有任何关系。
  • 知道了,谢谢原谅我的无知

标签: c++ string substr


【解决方案1】:

将两者都转换为小写,然后比较它们。

转换为更低:

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

比较字符串:

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

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

编辑

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

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

【讨论】:

  • 谢谢,但我想避免这种情况并像我们在 stricmp() 中所做的那样做
  • 因为 std::string 类支持通过 c_str() 转换为 C 风格的字符串,所以“恢复”为 strcmp 是微不足道的
  • int.begin()?不应该是 in.begin() 吗?
【解决方案2】:

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

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

现在你可以简单地做:

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

【讨论】:

  • 这样做的好处是您可以设置语言环境,std::tolower 尊重这一点;如其他地方所述,如果您尝试在 UTF-8 上使用它,您仍然不走运
  • @0x499602D2:非 ASCII 和非 BMP 之间存在 巨大 差异。您的代码适用于 ASCII,但不适用于 127 以上的任何代码点。BMP 不会出现(尽管 BMP 也失败)
  • 这不是批评顺便说一句,正确处理 UTF-8 并不容易
  • 感谢所有我学到了很多东西,最后最终使用了这个:void main() { std::string str1 = "abracadabra"; std::string str2 = "AbRaCaDaBra"; std::transform(str2.begin(), str2.end(), str2.begin(), tolower); if (!str1.compare(str2)) { std::cout
  • 我不确定这段代码是否正确回答了这个问题。这不应该使用std::equal 而不是std::lexicographical_compare 吗? std::lexicographical_compare 返回 true 如果第一个参数 小于 第二个参数并且需要具有相同语义的谓词。
猜你喜欢
  • 2012-02-29
  • 2014-06-20
  • 2013-07-22
  • 1970-01-01
  • 2021-05-09
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多