Antworten:
Ich würde die Vergleichsmethode verwenden:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Ein Ansatz, der eher dem Geist der Standardbibliothek entspricht, besteht darin, Ihren eigenen Algorithmus "begin_with" 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 bietet eine einfachere Schnittstelle zum Clientcode und ist mit den meisten Standardbibliothekscontainern kompatibel.
Schauen Sie sich die String Algo- Bibliothek von Boost an , die eine Reihe nützlicher Funktionen enthält, z. B. Starts_mit, Istart_with (ohne Berücksichtigung der Groß- und Kleinschreibung) usw. Wenn Sie nur einen Teil der Boost-Bibliotheken in Ihrem Projekt verwenden möchten, können Sie das Dienstprogramm bcp zum Kopieren verwenden nur benötigte Dateien
Es scheint, dass sich std :: string :: launch_with in C ++ 20 befindet, während std :: string :: find verwendet werden kann
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
da es einfach ist zu überprüfen, ob die Zeichenfolge mit einem Literal beginnt, ohne das Literal selbst zu wiederholen, um seine Größe zu ermitteln. Und danke, dass Sie auf die direkte C ++ 20-Lösung hingewiesen haben.
Ich habe das Gefühl, dass ich Ihre Frage nicht vollständig verstehe. Es sieht so aus, als ob es trivial sein sollte:
s[0]=='x' && s[1]=='y' && s[2]=='z'
Dies betrifft nur (höchstens) die ersten drei Zeichen. Die Verallgemeinerung für eine Zeichenfolge, die zur Kompilierungszeit unbekannt ist, würde erfordern, dass Sie die oben genannten durch eine Schleife ersetzen:
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
t
.