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.
Verwenden Sie einfach strcmp()
für Groß- und Kleinschreibung und strcmpi()
o stricmp()
für den Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung. Diese sind beide in der Header-Datei <string.h>
Format:
int strcmp(const char*,const char*); //for case sensitive
int strcmpi(const char*,const char*); //for case insensitive
Verwendung:
string a="apple",b="ApPlE",c="ball";
if(strcmpi(a.c_str(),b.c_str())==0) //(if it is a match it will return 0)
cout<<a<<" and "<<b<<" are the same"<<"\n";
if(strcmpi(a.c_str(),b.c_str()<0)
cout<<a[0]<<" comes before ball "<<b[0]<<", so "<<a<<" comes before "<<b;
Salida
Apfel und ApPlE sind dasselbe
a kommt vor b, also kommt Apfel vor Ball
Ich habe gute Erfahrungen mit der Internationale Komponenten für Unicode-Bibliotheken - Sie sind extrem leistungsfähig und bieten Methoden für die Konvertierung, die Unterstützung von Gebietsschemata, die Darstellung von Datum und Uhrzeit, die Zuordnung von Groß- und Kleinschreibung (die Sie anscheinend nicht wollen) und Kollation die einen Vergleich ohne Berücksichtigung von Groß- und Kleinschreibung (und mehr) ermöglicht. Ich habe nur die C++-Version der Bibliotheken verwendet, aber sie scheinen auch eine Java-Version zu haben.
Es gibt Methoden, um normalisierte Vergleiche durchzuführen, wie sie von @Coincoin erwähnt werden, und sie können sogar den lokalen Gegebenheiten Rechnung tragen - zum Beispiel (und dies ist ein Sortierbeispiel, keine strikte Gleichheit), sortiert die Buchstabenkombination "ll" im Spanischen (in Spanien) traditionell zwischen "l" und "m", also "lz" < "ll" < "ma".
Ein einfacher Weg, zwei Strings in C++ zu vergleichen (getestet für Windows), ist die Verwendung von _stricmp
// Case insensitive (could use equivalent _stricmp)
result = _stricmp( string1, string2 );
Wenn Sie mit std::string arbeiten wollen, ein Beispiel:
std::string s1 = string("Hello");
if ( _stricmp(s1.c_str(), "HELLO") == 0)
std::cout << "The string are equals.";
Weitere Informationen finden Sie hier: https://msdn.microsoft.com/it-it/library/e0z9k731.aspx
Nur ein Hinweis zu der von Ihnen letztendlich gewählten Methode: Wenn diese Methode zufällig die Verwendung von strcmp
wie einige Antworten vermuten lassen:
strcmp
funktioniert im Allgemeinen nicht mit Unicode-Daten. Im Allgemeinen funktioniert es nicht einmal mit bytebasierten Unicode-Kodierungen, wie utf-8, da strcmp
führt nur byteweise Vergleiche durch, und in utf-8 kodierte Unicode-Codepunkte können mehr als 1 Byte umfassen. Der einzige spezifische Unicode-Fall strcmp
richtig zu handhaben ist, wenn eine mit einer bytebasierten Kodierung kodierte Zeichenfolge nur Codepunkte unterhalb von U+00FF enthält - dann reicht der byteweise Vergleich aus.
Sieht aus wie oben Lösungen sind nicht mit vergleichen Methode und Implementierung insgesamt wieder so hier ist meine Lösung und hoffe, es funktioniert für Sie (Es funktioniert gut).
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
string tolow(string a)
{
for(unsigned int i=0;i<a.length();i++)
{
a[i]=tolower(a[i]);
}
return a;
}
int main()
{
string str1,str2;
cin>>str1>>str2;
int temp=tolow(str1).compare(tolow(str2));
if(temp>0)
cout<<1;
else if(temp==0)
cout<<0;
else
cout<<-1;
}
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.