Finden Sie heraus, wenn die Zeichenfolge endet mit einem weiteren string in C++
Wie kann ich herausfinden, ob ein string endet mit einem weiteren string in C++?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie kann ich herausfinden, ob ein string endet mit einem weiteren string in C++?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vergleichen Sie einfach die letzten n Zeichen mit
std::string::compare
:ending = ""
diese true zurück. (Das ist die erwartete Verhalten, IMO, und auch, was Java tut).Verwenden Sie diese Funktion:
std::equal(suffix.rbegin(), suffix.rend(), str.rbegin()
Im debug-Modus, es wirft:_DEBUG_ERROR("string iterator not decrementable");
value
undending
sind die gleiche Länge, meinst dustd::equal(value.rbegin(), value.rbegin() + ending.size(), ending.rbegin(), ending.rend()
Verwenden
boost::algorithm::ends_with
(siehe z.B. http://www.boost.org/doc/libs/1_34_0/doc/html/boost/algorithm/ends_with.html ):Beachten Sie, dass ab c++20 std::string wird endlich starts_with und ends_with. Scheint, wie es gibt eine chance, dass die von c++, 30 Saiten in c++ vielleicht endlich nutzbar werden, wenn Sie nicht Lesen diese aus weit entfernten Zukunft, können Sie diese startsWith/endsWith:
sowie einige zusätzliche Helfer überlastungen:
IMO, c++ - strings sind eindeutig dysfunktional, und nicht gemacht zu werden, verwendet in der realen Welt code. Aber es gibt eine Hoffnung, dass dies besser wird mindestens.
Ich weiß, die Frage ist für C++, aber wenn jemand braucht einen good ol' fashioned C-Funktion, um dies zu tun:
Den
std::mismatch
Methode kann diesem Zweck dienen, wenn verwendet, um rückwärts Durchlaufen vom Ende der beiden strings:std::equal
: bitte prüfen Sie im Voraus, dass die soll-suffix ist nicht länger als die Zeichenfolge, die Sie suchen für Sie in. Vernachlässigen, um zu überprüfen, dass führt zu undefiniertem Verhalten.Meiner Meinung nach einfachste, C++ Lösung ist:
s
anstatt nur zu testen, das Ende!Lassen
a
ein string sein undb
die Zeichenfolge, die Sie suchen. Verwendena.substr
um die letzten n Zeichen vona
und vergleichen Sie b (wobei n die Länge derb
)Oder verwenden Sie
std::equal
(gehören<algorithm>
)Ex:
das gleiche wie oben, hier ist meine Lösung
starts_with
wird "string::compare'? Warum nichtstd::equal(start.begin(), start.end(), str.begin())
?Lassen Sie mich erweitern Joseph ' s Lösung mit der groß-und Kleinschreibung version (online-demo)
können Sie string::rfind
Das vollständige Beispiel basiert auf Kommentare:
Bezüglich Grzegorz Bazior Antwort. Ich habe diese Umsetzung, aber original hat bug (gibt true zurück, wenn ich Vergleiche ".." mit ".so").
Ich schlage vor, die modifizierte Funktion:
Prüfen, ob str hat suffix, mit unten:
andere option ist die Verwendung von regex. Der folgende code macht die Suche unempfindlich gegenüber groß - /Kleinschreibung:
wahrscheinlich nicht so effizient, aber einfach zu implementieren.
Dachte ich, es macht Sinn, sich zu post eine rohe Lösung, die keine library-Funktionen...
Indem ein einfaches
std::tolower
wir können diese groß-und KleinschreibungWenn Sie wie ich sind und nicht so in C++ Purismus, hier ist ein altes skool-hybrid. Es gibt einige Vorteile, wenn die Saiten mehr als eine Handvoll Charaktere, wie die meisten
memcmp
Implementierungen vergleichen Maschine Worten, wenn möglich.Müssen Sie die Kontrolle über den Zeichensatz. Zum Beispiel, wenn dieser Ansatz verwendet wird, mit utf-8-Typ oder wchar-Typ, es gibt einige Nachteile, da es keine Unterstützung für Zeichen-mapping - z.B., wenn zwei oder mehr Zeichen werden logisch identisch.