comparación std :: string (cadena de comprobar si se inicia con otra cadena)
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 ().
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;
}