¿Cómo puedo saber si una cadena termina con otra cadena en C ++?
270
Simplemente compare los últimos n caracteres usando std::string::compare
:
#include <iostream>
bool hasEnding (std::string const &fullString, std::string const &ending) {
if (fullString.length() >= ending.length()) {
return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
} else {
return false;
}
}
int main () {
std::string test1 = "binary";
std::string test2 = "unary";
std::string test3 = "tertiary";
std::string test4 = "ry";
std::string ending = "nary";
std::cout << hasEnding (test1, ending) << std::endl;
std::cout << hasEnding (test2, ending) << std::endl;
std::cout << hasEnding (test3, ending) << std::endl;
std::cout << hasEnding (test4, ending) << std::endl;
return 0;
}
Utiliza esta función:
fuente
std::equal(suffix.rbegin(), suffix.rend(), str.rbegin()
en modo de depuración, arroja:_DEBUG_ERROR("string iterator not decrementable");
Uso
boost::algorithm::ends_with
(ver, por ejemplo, http://www.boost.org/doc/libs/1_34_0/doc/html/boost/algorithm/ends_with.html ):fuente
Tenga en cuenta que a partir de c ++ 20 std :: string finalmente se proporcionará begin_with y ends_with . Parece que existe la posibilidad de que con c ++ 30 cadenas en c ++ finalmente puedan ser utilizables, si no está leyendo esto desde un futuro lejano, puede usar estos comienzos con / fines con:
y algunas sobrecargas de ayuda adicionales:
En mi opinión, las cadenas de c ++ son claramente disfuncionales, y no fueron hechas para usarse en el código del mundo real. Pero existe la esperanza de que esto mejore al menos.
fuente
Sé que la pregunta es para C ++, pero si alguien necesita una buena función de C para hacer esto:
fuente
El
std::mismatch
método puede cumplir este propósito cuando se utiliza para iterar hacia atrás desde el final de ambas cadenas:fuente
std::equal
: debe verificar de antemano que el supuesto sufijo no sea más largo que la cadena en la que lo está buscando. Si no se verifica eso, se genera un comportamiento indefinido.En mi opinión, la solución más simple de C ++ es:
fuente
s
lugar de solo probar el final!std::string::size()
es una operación de tiempo constante; lo que no necesitastrlen
.Deje
a
ser una cadena yb
la cadena que busca. Usea.substr
para obtener los últimos n caracteres dea
y compárelos con b (donde n es la longitud deb
)O usar
std::equal
(incluir<algorithm>
)Ex:
fuente
Permítanme extender la solución de Joseph con la versión que no distingue entre mayúsculas y minúsculas ( demostración en línea )
fuente
igual que el anterior, aquí está mi solución
fuente
starts_with
Por qué usa 'string :: compare'? ¿Por qué nostd::equal(start.begin(), start.end(), str.begin())
?Otra opción es utilizar expresiones regulares. El siguiente código hace que la búsqueda sea insensible a mayúsculas / minúsculas:
Probablemente no tan eficiente, pero fácil de implementar.
fuente
puedes usar string :: rfind
El ejemplo completo basado en comentarios:
fuente
Compruebe si str tiene sufijo , utilizando a continuación:
fuente
Utilice el algoritmo std :: equal de
<algorithms>
con iteración inversa:fuente
Respecto a la respuesta de Grzegorz Bazior. Usé esta implementación, pero la original tiene un error (devuelve verdadero si comparo ".." con ".so"). Propongo una función modificada:
fuente
Pensé que tenía sentido publicar una solución en bruto que no usa ninguna función de biblioteca ...
Agregando un simple
std::tolower
podemos hacer que este caso sea insensiblefuente
Encontré esta buena respuesta al problema similar "startWith":
¿Cómo verifico si un C ++ std :: string comienza con una cadena determinada y convierto una subcadena en un int?
Puede adoptar la solución para buscar solo en el último lugar de la cadena:
De esta manera, puede hacerlo corto, rápido, usar c ++ estándar y hacerlo legible.
fuente
Si eres como yo y no te gusta el purismo de C ++, aquí hay un viejo híbrido skool. Hay una ventaja cuando las cadenas son más que un puñado de caracteres, como la mayoría
memcmp
implementaciones comparan palabras de máquina cuando es posible.Debe tener el control del conjunto de caracteres. Por ejemplo, si este enfoque se usa con utf-8 o tipo wchar, hay alguna desventaja ya que no admitirá la asignación de caracteres, por ejemplo, cuando dos o más caracteres son lógicamente idénticos .
fuente
Mis dos centavos:
fuente