функция — C ++, проверка равенства строк двух строк без учета регистра

Возможный дубликат:
Сравнение строк без учета регистра в 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;
}

2

Решение

Вы должны переименовать функцию в 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);
});
}
18

Другие решения

Функция выглядит довольно хорошо, за исключением того, что:

Эти преобразования в строки 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());

так как вы можете получить доступ к буквам std :: string как в строке c:

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

Также обратите внимание, что я удалил +1 от i<str1.length() + 1

Для других методов — смотрите там: Сравнение строк без учета регистра в C ++

2