insensitive Compare mit Länge
-
Ich suche eine C++ Funktion für den insensitive Compare von zwei C++ String, wobei man auch die Länge angeben kann. In C gibt es dafür folgende Funktion:
int _strnicmp(
const char *string1,
const char *string2,
size_t count
);Wie mache ich das mit der STL?
Gruss und danke,
T.
-
boost::iequals wäre wohl eine Möglichkeit. Für deine Längenangabe könntest du dann vielleicht mit substr arbeiten.
-
Du hast aber exotische Anforderungen
. Insensitive Vergleiche sehe ich ja noch die Notwendigkeit, aber mit Längenangabe? Aber ok, schreiben wir uns das doch eben schnell selbst:#include<string> #include<algorithm> #include<cctype> // true wenn lhs gleich rhs bis zur Länge length bool strnicmp(const std::string &lhs, const std::string &rhs, size_t length) { // Wenn length > kürzester String ---> false if (length > std::min(lhs.size(), rhs.size())) return false; for(size_t i=0; i<length; ++i) { if (std::tolower(lhs[i]) != std::tolower(rhs[i])) return false; } return true; }Entspricht dies ungefähr deinen Anforderungen? Bei der Längenangabe war ich nicht ganz sicher, wie du das genau meinst.
-
vergleichsfunktion gibt es ja genügend, auch mit längenangaben:
http://www.cplusplus.com/reference/string/string/compare/und für lower/upper einfach
std::tranform nutzenstd::string Text = "Hallo Welt"; std::transform(Text.begin(),Text.end(), Text.begin(),tolower);
-
Wenn die STL diesen "exotischen" Vergleich nicht vorsieht, dann ist deine Funktion wohl die eleganteste Lösung.
Danke!
-
Tomahawk schrieb:
Wenn die STL diesen "exotischen" Vergleich nicht vorsieht, dann ist deine Funktion wohl die eleganteste Lösung.
Wobei meine Funktion (bis auf den Range-Check) praktisch 100% dem entsprechen sollte, was strnicmp macht. Du kannst daher auch einfach das alte strnicmp benutzen.
-
SeppJ schrieb:
// Wenn length > kürzester String ---> false
würde ich als Fehler ansehen. Weil wenn beide Strings identisch sind, aber kleiner als length, gibt es ein false.
-
BigNeal schrieb:
SeppJ schrieb:
// Wenn length > kürzester String ---> false
würde ich als Fehler ansehen. Weil wenn beide Strings identisch sind, aber kleiner als length, gibt es ein false.
Ja, das fällt unter "Ich verstehe nicht so ganz wozu das gut sein soll". Vorher hatte ich stattdessen
length = std::min(std::min(lhs.size(), rhs.size()), length);
Dies ist dann wohl eher das was du meinst.
-