368 Stimmen

Herausfinden, ob eine Zeichenkette mit einer anderen Zeichenkette endet in C++

Wie kann ich in C++ herausfinden, ob eine Zeichenkette mit einer anderen Zeichenkette endet?

1voto

Andrew123 Punkte 337

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());
}

0voto

jws Punkte 1526

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;
}

0voto

Lasersköld Punkte 1380

Habe diese nette Antwort auf das ähnliche "startWith"-Problem gefunden:

Wie prüfe ich, ob ein C++ std::string mit einer bestimmten Zeichenfolge beginnt, und konvertieren Sie eine Teilzeichenkette in eine int?

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

0voto

user3018158 Punkte 41
bool endswith(const std::string &str, const std::string &suffix)
{
    string::size_type totalSize = str.size();
    string::size_type suffixSize = suffix.size();

    if(totalSize < suffixSize) {
        return false;
    }

    return str.compare(totalSize - suffixSize, suffixSize, suffix) == 0;
}

0voto

Joma Punkte 2432
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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X