Pregunta

Tengo que comprobar si un std: secuencia comienza con "XYZ". ¿Cómo lo hago sin tener que buscar a través de toda la cadena o la creación de cadenas temporales con substr ().

¿Fue útil?

Solución

Me gustaría utilizar método de comparación:

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

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

Otros consejos

Un enfoque que podría ser más acorde con el espíritu de la biblioteca estándar sería definir su propio 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());
}

Esto proporciona una interfaz más sencilla de código de cliente y es compatible con la mayoría de los contenedores Biblioteca estándar.

cadena Algo del Boost biblioteca, que tiene una serie de funciones útiles, tales como starts_with, istart_with (mayúsculas y minúsculas), etc. Si desea utilizar sólo una parte de las bibliotecas de impulso en su proyecto, a continuación, puede utilizar la utilidad bcp para copiar sólo los archivos necesarios

Parece que std :: string :: starts_with está dentro de C ++ 20, por su parte std :: string :: find se puede utilizar

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

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

siento que no estoy entendiendo plenamente su pregunta. Parece que debería ser trivial:

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

Esto sólo se ve en (en la mayoría) los tres primeros caracteres. La generalización de una cadena que no se conoce en tiempo de compilación que requieren volver a reemplazar el anterior con un bucle:

// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
  if (s[i]!=t[i])
    return false;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top