【问题标题】:C++, check case insensitive equality of two strings [duplicate]C ++,检查两个字符串的不区分大小写的相等性[重复]
【发布时间】:2012-09-16 02:35:32
【问题描述】:

可能重复:
Case insensitive string comparison in C++

我已经为 C++ 编写了一些代码来比较两个字符串是否相等。我想要的是校对。我计划在未来将它用于更多的程序,所以这个功能做好它的工作很重要。这个功能是否看起来像一个可重复使用、便携等的功能?有没有更“最新”的方法来做到这一点?我用了一个c库,但这是一个c++程序,这是禁忌吗?

谢谢,JH。

//function to compare two strings regardless of case 
//-- returns true if the two strings are equal
//-- returns false if
//  --the strings are unequal
//  --one of the strings is longer than 255 chars
bool isEqual(string str1, string str2){

  if(str1.length()!=str2.length())  //the strings are different lengths,
    return false;               //they can't be equal
  if((str1.length()>255) || (str2.length()>255))
    return false;

  char * cstr1 = new char [str1.length()+1];
  strcpy (cstr1, str1.c_str());
  char * cstr2 = new char [str2.length()+1];
  strcpy (cstr2, str2.c_str());

  for(int i=0; i<str1.length()+1; i++){
    if(toupper(cstr1[i]) != toupper(cstr2[i]))
      return false;
  }

  return true;
}

【问题讨论】:

  • 糟糕,您不希望它不区分大小写。
  • 对于初学者来说,你会泄漏内存。这是一件坏事。
  • 你永远不会delete cstr1cstr2,从而泄漏他们的内存。不过,我看不出你需要这些副本有什么用,因为无论如何你都不会更改它们。
  • 对于每一个新的,必须有一个删除。或者使用智能指针。
  • @LuchianGrigore 可能重复来自 2008 年。现在有更优雅的方法来比较不区分大小写的字符串:请参阅匿名的答案。

标签: c++ function code-reuse


【解决方案1】:

您应该将函数重命名为 isEqual_CaseInsensitive 或其他名称,使其名称与函数的作用相匹配。 您应该通过引用传递字符串以避免复制 您不需要创建字符串的副本来比较它们

    bool isEqual_CaseInsensitive(const string& a, const string& b)
    {
            return a.size() == b.size() &&
                std::equal(a.begin(), a.end(), b.begin(), [](char cA, char cB) {
                        return toupper(cA) == toupper(cB);
                   });
    }

【讨论】:

  • 非常感谢。这是对 return 关键字的优雅使用。
  • 这里有一个关于这个函数的问题:[](char cA, char cB) { return toupper(cA) == toupper(cB); }...这个函数是无名的吗?还是命名为[],还是[]表示这个函数的返回类型?毕竟它似乎是一个布尔函数(并且 std::equal 需要它,对吧?cplusplus.com/reference/algorithm/equal
  • +1。如果这个问题将被标记为重复:那里没有这样优雅的解决方案:stackoverflow.com/questions/11635/…,另一方面,这个问题来自 2008 年......
  • @JeffersonH​​udson 这是一个 lambda 函数,它是 c++11 的一部分。 [] 表示一个空闭包,该函数根本没有名称。有关 lambda 的更多信息,请参阅 msdn.microsoft.com/en-us/library/dd293608.aspx 或谷歌搜索
【解决方案2】:

这个功能看起来很不错,除了:

这些到 c 字符串的转换是不必要的:

  char * cstr1 = new char [str1.length()+1];
  strcpy (cstr1, str1.c_str());
  char * cstr2 = new char [str2.length()+1];
  strcpy (cstr2, str2.c_str());

因为你可以像 c 字符串一样访问 std::string 字母:

  for(int i=0; i<str1.length(); i++){
    if(toupper(str1[i]) != toupper(str2[i]))
      return false;
  }

还请注意,我从 i&lt;str1.length() + 1 中删除了 +1...

有关其他方法 - 参见:Case insensitive string comparison in C++

【讨论】:

  • @PiotrNycz 为此,您还需要确认它们的长度相同。
  • @loganfsmyth - 我假设其余的代码没有改变。并测试相等的长度。
猜你喜欢
  • 2015-04-22
  • 2012-02-29
  • 2014-06-20
  • 2014-04-11
  • 2012-01-19
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多