Frage

Ich brauche, ob ein std zu überprüfen: string beginnt mit „xyz“. Wie kann ich es tun, ohne durch die ganze Zeichenfolge zu suchen oder temporäre Strings mit substr Erstellen von ().

War es hilfreich?

Lösung

Ich würde Methode vergleichen:

std::string s("xyzblahblah");
std::string t("xyz")

if (s.compare(0, t.length(), t) == 0)
{
// ok
}

Andere Tipps

Einen Ansatz, der mehr im Einklang mit dem Geist des Standard Library wäre vielleicht zu Ihrem eigenen begins_with Algorithmus zu definieren.

#include <algorithm>
using namespace std;


template<class TContainer>
bool begins_with(const TContainer& input, const TContainer& match)
{
    return input.size() >= match.size()
        && equal(match.begin(), match.end(), input.begin());
}

Dies stellt eine einfachere Schnittstelle zu Client-Code und ist kompatibel mit den meisten Standard Library Containern.

Blick auf die Boost- String Algo Bibliothek, das hat eine Reihe von nützlichen Funktionen, wie starts_with, istart_with (Groß- und Kleinschreibung), etc. Wenn Sie nur einen Teil der Boost-Bibliotheken in Ihrem Projekt verwenden möchten, dann können Sie bcp verwenden nur benötigt, um Dateien zu kopieren

Es scheint, dass std :: string :: starts_with innen C ist 20 ++, mittlerweile std :: string :: verwendet werden können, finden

std::string s1("xyzblahblah");
std::string s2("xyz")

if (s1.find(s2) == 0)
{
   // ok, s1 starts with s2
}

Ich glaube, ich bin nicht ganz Ihre Frage zu verstehen. Es sieht aus, als ob es sollte trivial sein:

s[0]=='x' && s[1]=='y' && s[2]=='z'

Das sieht nur auf (höchstens) die ersten drei Zeichen. Die Verallgemeinerung für eine Zeichenfolge, die zum Zeitpunkt der Kompilierung unbekannt ist, würden Sie benötigt die oben mit einer Schleife zu ersetzen:

// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
  if (s[i]!=t[i])
    return false;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top