Domanda

Ho bisogno di verificare se uno std: stringa inizia con "xyz". Come posso fare senza la ricerca attraverso l'intera stringa o la creazione di stringhe temporanee con substr ().

È stato utile?

Soluzione

Vorrei utilizzare metodo compare:

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

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

Altri suggerimenti

Un approccio che potrebbe essere più in linea con lo spirito della libreria standard potrebbe essere quella di definire il proprio algoritmo begins_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());
}

Questo fornisce un'interfaccia più semplice per codice del client ed è compatibile con la maggior parte dei contenitori della libreria standard.

Guardate al di Boost String Algo biblioteca, che ha un certo numero di funzioni utili, come starts_with, istart_with (case insensitive), ecc Se si desidera utilizzare solo una parte delle librerie Boost nel progetto, quindi è possibile utilizzare utilità bcp per copiare i file necessari solo

Sembra che std :: string :: starts_with è dentro C ++ 20, nel frattempo std :: string :: trovare può essere utilizzato

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

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

sento che non sto capendo pienamente alla tua domanda. Sembra come se dovrebbe essere banale:

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

Questa guarda solo (al massimo) i primi tre caratteri. La generalizzazione per una stringa, che è sconosciuto al momento della compilazione richiederebbe di sostituire il precedente 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top