Wie kann ich in C++ herausfinden, ob eine Zeichenkette mit einer anderen Zeichenkette endet?
Antworten
Zu viele Anzeigen?Zu der Antwort von Grzegorz Bazior. Ich habe diese Implementierung verwendet, aber das Original hat einen Fehler (gibt true zurück, wenn ich ".." mit ".so" vergleiche). Ich schlage eine modifizierte Funktion vor:
bool endsWith(const string& s, const string& suffix)
{
return s.size() >= suffix.size() && s.rfind(suffix) == (s.size()-suffix.size());
}
Wenn Sie wie ich sind und nicht so sehr auf C++-Purismus stehen, haben wir hier einen Old-Skool-Hybrid. Es ist von Vorteil, wenn Strings mehr als eine Handvoll Zeichen umfassen, da die meisten memcmp
Implementierungen vergleichen Maschinenwörter, wenn möglich.
Sie müssen die Kontrolle über den Zeichensatz haben. Wenn dieser Ansatz zum Beispiel mit dem Typ utf-8 oder wchar verwendet wird, gibt es einen Nachteil, da er keine Zeichenzuordnung unterstützt - z.B. wenn zwei oder mehr Zeichen logisch identisch .
bool starts_with(std::string const & value, std::string const & prefix)
{
size_t valueSize = value.size();
size_t prefixSize = prefix.size();
if (prefixSize > valueSize)
{
return false;
}
return memcmp(value.data(), prefix.data(), prefixSize) == 0;
}
bool ends_with(std::string const & value, std::string const & suffix)
{
size_t valueSize = value.size();
size_t suffixSize = suffix.size();
if (suffixSize > valueSize)
{
return false;
}
const char * valuePtr = value.data() + valueSize - suffixSize;
return memcmp(valuePtr, suffix.data(), suffixSize) == 0;
}
Habe diese nette Antwort auf das ähnliche "startWith"-Problem gefunden:
Sie können die Lösung übernehmen, um nur an der letzten Stelle der Zeichenkette zu suchen:
bool endsWith(const std::string& stack, const std::string& needle) {
return stack.find(needle, stack.size() - needle.size()) != std::string::npos;
}
T
bool EndsWith(const std::string& data, const std::string& suffix)
{
return data.find(suffix, data.size() - suffix.size()) != std::string::npos;
}
T
#include <iostream>
int main()
{
cout << EndsWith(u8"o!hello!1", u8"o!") << endl;
cout << EndsWith(u8"o!hello!", u8"o!") << endl;
cout << EndsWith(u8"hello!", u8"o!") << endl;
cout << EndsWith(u8"o!hello!o!", u8"o!") << endl;
return 0;
}
O
0
1
1
1