Necesito comprobar si una cadena std: comienza con "xyz". ¿Cómo lo hago sin buscar en toda la cadena o crear cadenas temporales con substr ()?
Respuestas:
Usaría el método de comparación:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Un enfoque que podría estar más en consonancia con el espíritu de la biblioteca estándar sería definir su propio algoritmo starts_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 para el código del cliente y es compatible con la mayoría de los contenedores de la biblioteca estándar.
Busque la biblioteca String Algo de Boost , que tiene una serie de funciones útiles, como starts_with, istart_with (no distingue entre mayúsculas y minúsculas), etc. Si desea utilizar solo una parte de las bibliotecas boost en su proyecto, puede usar la utilidad bcp para copiar solo archivos necesarios
Parece que std :: string :: starts_with está dentro de C ++ 20, mientras que std :: string :: find se puede usar
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
porque facilita verificar si la cadena comienza con un literal sin repetir el literal en sí para encontrar su tamaño. Y gracias por señalar la solución directa C ++ 20.
Siento que no entiendo completamente su pregunta. Parece que debería ser trivial:
s[0]=='x' && s[1]=='y' && s[2]=='z'
Esto solo mira (como máximo) los primeros tres caracteres. La generalización para una cadena que se desconoce en el momento de la compilación requeriría que reemplace lo 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;
}
t
.