String vergleichen ohne Groß/Kleinschreibung zu berücksichtigen
-
Der Titel sagt es schon. wie geht das am besten mit C++ Bordmitteln? Mein naiver Ansatz war, von beiden Strings eine Kopie zu machen und diese in Großbuchstaben umzuwandeln. Das funktioniert auch, lässt sich recht kurz und elegant hinschreiben, aber ist aufgrund der dynamischen Speicherallokation für meinen aktuellen Fall nicht geeignet. In "The C++ Programming Language" von Bjarne Stroustrup wurde erwähnt, dass man so etwas mit facets lösen kann wenn ich das richtig in Erinnerung habe. ich muss allerdings zugeben, dass ich nie verstanden habe wie facets funktionieren und wozu sie gut sind und auch noch keinen getroffen habe der sie explizit verwendet. Wisst ihr da mehr?
Ansonsten muss man wohl eine eigene Vergleichsfunktion schreiben, aber so ganz toll erscheint mir das auch nicht.
-
Es gibt out of the box keine Implementierung davon.
Du musst dir selber eine Funktion dafür schreibe und dann diese in Zukunft benutzen. Ich wüsste nicht, was daran so schlimm ist?
Wenn du magst kannst du auch boost's Implementierung davon verwenden, da gabs was. Aber ob was jetzt besser ist, als sich eben eine eigene zu schreiben? Denke nicht.
-
Wie kann man Strings case-insensitiv vergleichen? (etwas nach unten scrollen, oben sind die anderen FAQ-Links
-
Brauchst du auch so Sachen wie ß == SS?
-
TGGC schrieb:
Brauchst du auch so Sachen wie ß == SS?
Ist das so?
Nicht zu vergessen Römerstraße == RoemerstaBe(nette Amis) == Roemerstrasse(Schweizer, oder?) == Römerstr.(psotalisch auch ok)
-
cvcv schrieb:
Du musst dir selber eine Funktion dafür schreibe und dann diese in Zukunft benutzen. Ich wüsste nicht, was daran so schlimm ist?
Ob das schlimm ist, hängt vor allem davon ab wie vollständig man es haben möchte. Für rein englischsprachige Texte ist es z.B. simpel genug. Wenn die Strings allerdings z.B. in UTF-8 vorliegen, wird es schon bei Deutsch etwas komplizierter, da es z.B. für Umlaute nicht mehr ausreicht einen einzelnen
char
in einen anderen umzuwandeln. Spätestens jedoch wenn ich den vollständigen Unicode-Zeichensatz korrekt unterstützen möchte (mit all den Sonderregeln die es für andere Sprachen und Alphabete geben mag), würde ich persönlich lieber auf etwas Fertiges zurückgreifen.Finn
-
Wie wäre es mit
transform(to_modify.begin(), to_modify.end(), to_modify.begin(), tolower );
?
Deckt natürlich nicht deutsche Sonderzeichen und sowas ab.
-
volkard schrieb:
Ist das so?
Ja, ist es.
-
volkard schrieb:
Nicht zu vergessen Römerstraße == RoemerstaBe(nette Amis) == Roemerstrasse(Schweizer, oder?) == Römerstr.(psotalisch auch ok)
Du hast Romerstaβe (Japaner) vergessen.
-
Marthog schrieb:
Du hast Romerstaβe (Japaner) vergessen.
Wenn wir schon dabei sind: RÖMERSTRAẞE!!!11einself
-
boost::iequals
?
-
TGGC schrieb:
volkard schrieb:
Ist das so?
Ja, ist es.
Nö.
-
Schreib halt nichts, wenn du keine Ahnung davon hast. Es ist ein offensichtlicher Design-Fehler der C++ Lib das sich lower und upper Methoden nur auf code units beziehen.
-
cvcv schrieb:
Es gibt out of the box keine Implementierung davon.
Du musst dir selber eine Funktion dafür schreibe und dann diese in Zukunft benutzen. Ich wüsste nicht, was daran so schlimm ist?
Also ich finds schon traurig (== schlimm) dass so eine alte Sprache wie C++ immer noch keine vernünftigen Methoden für so elementare Sachen anbietet.
Es gibt ja noch nichtmal ein vernünftiges replace_all für strings...
Wenn ich nach einer Zeit C# wieder in C++ mit strings hantieren muss bin ich die ganze Zeit nur am fluchen weil man ständig das "Rad neu erfinden" muss
-
Ich finde man muss nicht alles gleich in den Sprachstandard aufnehmen. Wenn du solche Funktionen häufig brauchst schreib dir halt ne lib oder nutze Eine die das schon kann. Dann flucht man nur einmal.
-
happystudent schrieb:
Wenn ich nach einer Zeit C# wieder in C++ mit strings hantieren muss bin ich die ganze Zeit nur am fluchen weil man ständig das "Rad neu erfinden" muss
Wenn du dir nicht eine Funktion schreiben kannst, die das für dich erledigt bist du eher ein unlucky- and unhappystudent.
-
Braunstein schrieb:
Ich finde man muss nicht alles gleich in den Sprachstandard aufnehmen.
Naja, was heisst hier 'alles'?
Sowas wie regex ist im Standard, aber eine gefühlt viel allgemeinere Funktion wie string::replaceAll nicht.
ReplaceAll würde string sicherlich nicht unnötig aufblähen.
-
EOP schrieb:
Wenn du dir nicht eine Funktion schreiben kannst, die das für dich erledigt bist du eher ein
unlucky- and unhappystudent.Student ist man um zu lernen und nicht um schon alles zu können.
Das Problem ist ja nicht dass das schwierig wäre sondern dass das Benutzen der Sprache durch trivial zu lösende Dinge unnötig erschwert/verlangsamt wird.
Schließlich kosten auch diese Dinge Zeit (und damit im Zweifelsfall Geld). Und sind u.U. dann doch nicht so einfach zu lösen wie anfangs gedacht, siehe TE.
-
EOP schrieb:
Wenn du dir nicht eine Funktion schreiben kannst, die das für dich erledigt bist du eher ein unlucky- and unhappystudent.
Ich weiss nicht ob du vielleicht im Jahr 2015 immer noch in einer ASCII-Welt lebst, aber wenn ich mit den Unicode-Standard zum Thema Groß/Kleinschreibung und im besonderen "Case Folding" anschaue, wäre ich ganz froh darum, wenn die Standardbibliothek solche elementaren Funktionen unterstützen würde, und man sich dafür nicht so einen Moloch wie bspw. ICU bemühen, oder es gar selbst implementieren muss.
Wenn man wirklich nur ASCII benötigt, dann sind
std::toupper
und Konsorten eine gute Wahl, und man kann die Funktion durchaus selbst schreiben. Sobald man in exotischere Gefilde vorstößt - und das geht je nach Codierung schon bei der deutschen Sprache los - kommt man mitstd::toupper
nicht mehr wirklich weit.Finnegan
-
Finnegan schrieb:
wäre ich ganz froh darum, wenn die Standardbibliothek solche elementaren Funktionen unterstützen würde
Naja, ganz so elementar und trivial und global einsetzbar ist es eben dann wohl doch nicht.
Gibt es z.B. Im Arabischen oder Chinesischen überhaupt Groß- und Kleinschreibung?
Mit den 1200 verschiedenen indischen Schriften will ich gar nicht erst anfangen.Alles nicht so einfach.
-
Und vor allem ists erstmal ein wahnsinniger Overhead...