Devo controllare se una stringa std: inizia con "xyz". Come faccio a farlo senza cercare nell'intera stringa o creare stringhe temporanee con substr ().
Risposte:
Userei il metodo di confronto:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Un approccio che potrebbe essere più in linea con lo spirito della libreria standard sarebbe definire il proprio algoritmo begin_with.
#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());
}
Ciò fornisce un'interfaccia più semplice al codice client ed è compatibile con la maggior parte dei contenitori della libreria standard.
Guarda la libreria String Algo di Boost , che ha un numero di funzioni utili, come starts_with, istart_with (senza distinzione tra maiuscole e minuscole), ecc. Se vuoi usare solo una parte delle librerie boost nel tuo progetto, puoi usare l'utility bcp per copiare solo file necessari
Sembra che std :: string :: starts_with sia all'interno di C ++ 20, mentre std :: string :: find può essere usato
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
perché rende facile controllare se la stringa inizia con un letterale senza ripetere il letterale stesso per trovare la sua dimensione. E grazie per aver indicato la soluzione diretta C ++ 20.
Sento di non comprendere appieno la tua domanda. Sembra che dovrebbe essere banale:
s[0]=='x' && s[1]=='y' && s[2]=='z'
Questo guarda solo (al massimo) i primi tre caratteri. La generalizzazione di una stringa sconosciuta in fase di compilazione richiederebbe di sostituire quanto sopra con un ciclo:
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
t
.