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.
Véase std::lexicographical_compare
:
// lexicographical_compare example
#include <iostream> // std::cout, std::boolalpha
#include <algorithm> // std::lexicographical_compare
#include <cctype> // std::tolower
// a case-insensitive comparison function:
bool mycomp (char c1, char c2) {
return std::tolower(c1) < std::tolower(c2);
}
int main () {
char foo[] = "Apple";
char bar[] = "apartment";
std::cout << std::boolalpha;
std::cout << "Comparing foo and bar lexicographically (foo < bar):\n";
std::cout << "Using default comparison (operator<): ";
std::cout << std::lexicographical_compare(foo, foo + 5, bar, bar + 9);
std::cout << '\n';
std::cout << "Using mycomp as comparison object: ";
std::cout << std::lexicographical_compare(foo, foo + 5, bar, bar + 9, mycomp);
std::cout << '\n';
return 0;
}
Kurz und gut. Keine weiteren Abhängigkeiten, außer erweitert std C lib.
strcasecmp(str1.c_str(), str2.c_str()) == 0
gibt zurück. wahr wenn str1
y str2
gleich sind. strcasecmp
möglicherweise nicht existieren, könnte es Analogien geben stricmp
, strcmpi
, usw.
Beispiel-Code:
#include <iostream>
#include <string>
#include <string.h> //For strcasecmp(). Also could be found in <mem.h>
using namespace std;
/// Simple wrapper
inline bool str_ignoreCase_cmp(std::string const& s1, std::string const& s2) {
if(s1.length() != s2.length())
return false; // optimization since std::string holds length in variable.
return strcasecmp(s1.c_str(), s2.c_str()) == 0;
}
/// Function object - comparator
struct StringCaseInsensetiveCompare {
bool operator()(std::string const& s1, std::string const& s2) {
if(s1.length() != s2.length())
return false; // optimization since std::string holds length in variable.
return strcasecmp(s1.c_str(), s2.c_str()) == 0;
}
bool operator()(const char *s1, const char * s2){
return strcasecmp(s1,s2)==0;
}
};
/// Convert bool to string
inline char const* bool2str(bool b){ return b?"true":"false"; }
int main()
{
cout<< bool2str(strcasecmp("asd","AsD")==0) <<endl;
cout<< bool2str(strcasecmp(string{"aasd"}.c_str(),string{"AasD"}.c_str())==0) <<endl;
StringCaseInsensetiveCompare cmp;
cout<< bool2str(cmp("A","a")) <<endl;
cout<< bool2str(cmp(string{"Aaaa"},string{"aaaA"})) <<endl;
cout<< bool2str(str_ignoreCase_cmp(string{"Aaaa"},string{"aaaA"})) <<endl;
return 0;
}
Ausgabe:
true
true
true
true
true
Visual C++ String-Funktionen, die Unicode unterstützen: http://msdn.microsoft.com/en-us/library/cc194799.aspx
derjenige, den Sie wahrscheinlich suchen, ist _wcsnicmp
ZU IHRER INFORMATION, strcmp()
y stricmp()
sind anfällig für Pufferüberläufe, da sie nur so lange verarbeitet werden, bis sie auf einen Nullterminator treffen. Sicherer ist es, die _strncmp()
y _strnicmp()
.
Le site Boost.String Bibliothek verfügt über eine Vielzahl von Algorithmen für die Durchführung von Fall-zu-Fall-Vergleichen und so weiter.
Sie könnten Ihre eigene Lösung einführen, aber warum sollten Sie sich die Mühe machen, wenn es bereits getan wurde?
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.