Возможный дубликат:
Сравнение строк без учета регистра в 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;
}
Вы должны переименовать функцию в 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);
});
}
Функция выглядит довольно хорошо, за исключением того, что:
Эти преобразования в строки 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 ++