Wie kann ich herausfinden, ob eine Zeichenfolge in C ++ mit einer anderen Zeichenfolge endet?
270
Vergleichen Sie einfach die letzten n Zeichen mit std::string::compare
:
#include <iostream>
bool hasEnding (std::string const &fullString, std::string const &ending) {
if (fullString.length() >= ending.length()) {
return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
} else {
return false;
}
}
int main () {
std::string test1 = "binary";
std::string test2 = "unary";
std::string test3 = "tertiary";
std::string test4 = "ry";
std::string ending = "nary";
std::cout << hasEnding (test1, ending) << std::endl;
std::cout << hasEnding (test2, ending) << std::endl;
std::cout << hasEnding (test3, ending) << std::endl;
std::cout << hasEnding (test4, ending) << std::endl;
return 0;
}
Verwenden Sie diese Funktion:
quelle
std::equal(suffix.rbegin(), suffix.rend(), str.rbegin()
Im Debug-Modus wird_DEBUG_ERROR("string iterator not decrementable");
Verwendung
boost::algorithm::ends_with
(siehe z. B. http://www.boost.org/doc/libs/1_34_0/doc/html/boost/algorithm/ends_with.html ):quelle
Beachten Sie, dass ab c ++ 20 std :: string endlich Start_with und Endes_with liefert . Es scheint, dass es eine Chance gibt, dass durch c ++ 30 Zeichenfolgen in c ++ endlich verwendbar werden. Wenn Sie dies nicht aus ferner Zukunft lesen, können Sie diese StartsWith / EndsWith verwenden:
und einige zusätzliche Helferüberladungen:
IMO, C ++ - Zeichenfolgen sind eindeutig nicht funktionsfähig und wurden nicht für die Verwendung im Code der realen Welt entwickelt. Aber es besteht die Hoffnung, dass dies zumindest besser wird.
quelle
Ich kenne die Frage für C ++, aber wenn jemand eine gute, altmodische C-Funktion benötigt, um dies zu tun:
quelle
Die
std::mismatch
Methode kann diesen Zweck erfüllen, wenn sie verwendet wird, um vom Ende beider Zeichenfolgen rückwärts zu iterieren:quelle
std::equal
: Sie müssen im Voraus überprüfen, ob das angebliche Suffix nicht länger als die Zeichenfolge ist, in der Sie danach suchen. Wenn Sie dies nicht überprüfen, führt dies zu undefiniertem Verhalten.Meiner Meinung nach ist die einfachste C ++ - Lösung:
quelle
s
anstatt nur das Ende zu testen!std::string::size()
ist eine Operation mit konstanter Zeit. es braucht nichtstrlen
.Sei
a
eine Zeichenfolge undb
die Zeichenfolge, nach der du suchst. Verwenden Siea.substr
diese Option , um die letzten n Zeichen vona
abzurufen und mit b zu vergleichen (wobei n die Länge von istb
).Oder verwenden Sie
std::equal
(enthalten<algorithm>
)Ex:
quelle
Lassen Sie mich Josephs Lösung mit der Version ohne Berücksichtigung der Groß- und Kleinschreibung erweitern ( Online-Demo )
quelle
Genau wie oben, hier ist meine Lösung
quelle
starts_with
wird 'string :: compare' verwendet? Warum nichtstd::equal(start.begin(), start.end(), str.begin())
?Eine andere Möglichkeit ist die Verwendung von Regex. Der folgende Code macht die Suche unempfindlich gegenüber Groß- / Kleinschreibung:
wahrscheinlich nicht so effizient, aber einfach zu implementieren.
quelle
Sie können string :: rfind verwenden
Das vollständige Beispiel basiert auf Kommentaren:
quelle
Überprüfen Sie, ob str das Suffix hat , indem Sie Folgendes verwenden:
quelle
Verwenden Sie den Algorithmus std :: same
<algorithms>
mit umgekehrter Iteration:quelle
In Bezug auf Grzegorz Bazior Antwort. Ich habe diese Implementierung verwendet, aber die ursprüngliche hat einen Fehler (gibt true zurück, wenn ich ".." mit ".so" vergleiche). Ich schlage eine modifizierte Funktion vor:
quelle
Ich fand es sinnvoll, eine Rohlösung zu veröffentlichen, die keine Bibliotheksfunktionen verwendet ...
Wenn
std::tolower
wir eine einfache hinzufügen, können wir diesen Fall unempfindlich machenquelle
Fand diese nette Antwort auf das ähnliche "startWith" -Problem:
Wie überprüfe ich, ob ein C ++ std :: string mit einem bestimmten String beginnt, und konvertiere einen Teilstring in einen int?
Sie können die Lösung verwenden, um nur an der letzten Stelle in der Zeichenfolge zu suchen:
Auf diese Weise können Sie es kurz und schnell machen, Standard-C ++ verwenden und es lesbar machen.
quelle
Wenn Sie wie ich sind und sich nicht für C ++ - Purismus interessieren, dann ist hier ein alter Skool-Hybrid. Es gibt einige Vorteile, wenn Zeichenfolgen mehr als eine Handvoll Zeichen enthalten, da die meisten
memcmp
Implementierungen Maschinenwörter vergleichen, wenn dies möglich ist.Sie müssen die Kontrolle über den Zeichensatz haben. Wenn dieser Ansatz beispielsweise mit utf-8 oder wchar verwendet wird, gibt es einige Nachteile, da er die Zeichenzuordnung nicht unterstützt - z. B. wenn zwei oder mehr Zeichen logisch identisch sind .
quelle
Meine zwei Cent:
quelle