关于函数:C ++,检查两个字符串的大小写不敏感

C++, check case insensitive equality of two strings

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Case insensitive string comparison in C++

我为C++编写了一些代码来比较两个字符串的相等性。我想要的是校对。我计划在将来将它用于更多的程序,所以这个函数做好它的工作是很重要的。这个函数看起来像是可重用、可移植的函数吗?有没有更"最新"的方法来做这个?我用了一个C库,但这是一个C++程序,是不是禁忌?

谢谢,JH。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//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;
}


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

1
2
3
4
5
6
7
    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);
                   });
    }


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

不需要将这些转换为C字符串:

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

因为您可以访问STD::字符串字母,如C字符串:

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

还请注意,我从i中删除了+1

对于其他方法——参见:C++中的大小写不敏感字符串比较