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?

27voto

xtofl Punkte 39285

En std::mismatch Methode kann diesen Zweck erfüllen, wenn sie verwendet wird, um rückwärts vom Ende der beiden Strings zu iterieren:

const string sNoFruit = "ThisOneEndsOnNothingMuchFruitLike";
const string sOrange = "ThisOneEndsOnOrange";

const string sPattern = "Orange";

assert( mismatch( sPattern.rbegin(), sPattern.rend(), sNoFruit.rbegin() )
          .first != sPattern.rend() );

assert( mismatch( sPattern.rbegin(), sPattern.rend(), sOrange.rbegin() )
          .first == sPattern.rend() );

18voto

baziorek Punkte 2147

Meiner Meinung nach ist die einfachste Lösung C++:

bool endsWith(const std::string& s, const std::string& suffix)
{
    return s.rfind(suffix) == std::abs(s.size()-suffix.size());
}

Warnung: Wenn der Treffer fehlschlägt, wird die gesamte Zeichenkette rückwärts durchsucht, bevor aufgegeben wird, wodurch möglicherweise viele Zyklen verschwendet werden.

12voto

Dario Punkte 47246

Sea a eine Zeichenkette sein und b die Zeichenfolge, die Sie suchen. Verwenden Sie a.substr um die letzten n Zeichen von a und vergleichen sie mit b (wobei n die Länge von b )

Oder verwenden Sie std::equal (enthalten <algorithm> )

Ex:

bool EndsWith(const string& a, const string& b) {
    if (b.size() > a.size()) return false;
    return std::equal(a.begin() + a.size() - b.size(), a.end(), b.begin());
}

10voto

Sergei Krivonos Punkte 3471

Verwenden Sie den std::equal-Algorithmus aus <algorithms> mit umgekehrter Iteration:

std::string LogExt = ".log";
if (std::equal(LogExt.rbegin(), LogExt.rend(), filename.rbegin())) {
   …
}

8voto

PolarBear Punkte 727

Lassen Sie mich die Josephs Lösung mit der Version, die Groß- und Kleinschreibung nicht berücksichtigt ( Online-Demo )

#include <string>
#include <cctype>

static bool EndsWithCaseInsensitive(const std::string& value, const std::string& ending) {
    if (ending.size() > value.size()) {
        return false;
    }
    return std::equal(ending.crbegin(), ending.crend(), value.crbegin(),
        [](const unsigned char a, const unsigned char b) {
            return std::tolower(a) == std::tolower(b);
        }
    );
}

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