Was ist der beste Weg, um case-insensitive String-Vergleich in C++ ohne Umwandlung einer Zeichenfolge in alle Groß- oder Kleinschreibung zu tun?
Bitte geben Sie an, ob die Methoden Unicode-freundlich sind und wie portabel sie sind.
Was ist der beste Weg, um case-insensitive String-Vergleich in C++ ohne Umwandlung einer Zeichenfolge in alle Groß- oder Kleinschreibung zu tun?
Bitte geben Sie an, ob die Methoden Unicode-freundlich sind und wie portabel sie sind.
Seit Anfang 2013 ist das ICU-Projekt, das von IBM betreut wird, eine ziemlich gute Antwort auf diese Frage.
ICU ist eine "vollständige, portable Unicode-Bibliothek, die sich eng an die Industriestandards hält". Für das spezifische Problem des String-Vergleichs leistet das Collation-Objekt, was Sie wollen.
Das Mozilla-Projekt hat ICU Mitte 2012 für die Internationalisierung in Firefox übernommen. Sie können die technische Diskussion, einschließlich der Probleme mit Build-Systemen und der Größe von Datendateien, hier verfolgen:
Wenn Sie nicht möchten, dass Boost-Bibliothek dann ist hier die Lösung, die nur C++-Standard-io-Header verwendet.
#include <iostream>
struct iequal
{
bool operator()(int c1, int c2) const
{
// case insensitive comparison of two characters.
return std::toupper(c1) == std::toupper(c2);
}
};
bool iequals(const std::string& str1, const std::string& str2)
{
// use std::equal() to compare range of characters using the functor above.
return std::equal(str1.begin(), str1.end(), str2.begin(), iequal());
}
int main(void)
{
std::string str_1 = "HELLO";
std::string str_2 = "hello";
if(iequals(str_1,str_2))
{
std::cout<<"String are equal"<<std::endl;
}
else
{
std::cout<<"String are not equal"<<std::endl;
}
return 0;
}
bool insensitive_c_compare(char A, char B){
static char mid_c = ('Z' + 'a') / 2 + 'Z';
static char up2lo = 'A' - 'a'; /// the offset between upper and lowers
if ('a' >= A and A >= 'z' or 'A' >= A and 'Z' >= A)
if ('a' >= B and B >= 'z' or 'A' >= B and 'Z' >= B)
/// check that the character is infact a letter
/// (trying to turn a 3 into an E would not be pretty!)
{
if (A > mid_c and B > mid_c or A < mid_c and B < mid_c)
{
return A == B;
}
else
{
if (A > mid_c)
A = A - 'a' + 'A';
if (B > mid_c)/// convert all uppercase letters to a lowercase ones
B = B - 'a' + 'A';
/// this could be changed to B = B + up2lo;
return A == B;
}
}
}
Dies könnte wahrscheinlich viel effizienter gemacht werden, aber hier ist eine sperrige Version mit all ihren Teilen nackt.
nicht ganz so tragbar, aber funktioniert gut mit allem, was auf meinem Computer ist (keine Ahnung, ich bin ein Bild- und kein Wortmensch)
Eine einfache Möglichkeit, Zeichenketten zu vergleichen, die sich nur durch Klein- und Großbuchstaben unterscheiden, ist ein Ascii-Vergleich. Alle Groß- und Kleinbuchstaben unterscheiden sich in der ASCII-Tabelle um 32 Bits, so dass sich folgende Informationen ergeben...
for( int i = 0; i < string2.length(); i++)
{
if (string1[i] == string2[i] || int(string1[i]) == int(string2[j])+32 ||int(string1[i]) == int(string2[i])-32)
{
count++;
continue;
}
else
{
break;
}
if(count == string2.length())
{
//then we have a match
}
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.