Como posso descobrir se uma string termina com outra string em C ++?
270
Basta comparar os ú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;
}
Use esta função:
fonte
std::equal(suffix.rbegin(), suffix.rend(), str.rbegin()
No modo de depuração, ele lança:_DEBUG_ERROR("string iterator not decrementable");
Use
boost::algorithm::ends_with
(consulte, por exemplo, http://www.boost.org/doc/libs/1_34_0/doc/html/boost/algorithm/ends_with.html ):fonte
Observe que, a partir de c ++ 20 std :: string, finalmente será fornecido o start_with e ends_with . Parece que há uma chance de que, por c ++, 30 strings em c ++ possam finalmente se tornar utilizáveis, se você não estiver lendo isso em um futuro distante, poderá usar esses beginWith / endsWith:
e algumas sobrecargas auxiliares extras:
IMO, strings c ++ são claramente disfuncionais e não foram feitas para serem usadas no código do mundo real. Mas há uma esperança de que isso melhore, pelo menos.
fonte
Eu sei que a pergunta é para C ++, mas se alguém precisar de uma boa e antiga função C para fazer isso:
fonte
O
std::mismatch
método pode servir a esse propósito quando usado para iterar para trás a partir do final de ambas as strings:fonte
std::equal
: você precisa verificar com antecedência se o suposto sufixo não é maior que a string em que está procurando. Negligenciar a verificação que leva a um comportamento indefinido.Na minha opinião mais simples, a solução C ++ é:
fonte
s
de caracteres em vez de apenas testar o final dela!std::string::size()
é uma operação de tempo constante; não precisastrlen
.Seja
a
uma string eb
a string que você procura. Usea.substr
para obter os últimos n caracteres dea
e compará-los com b (onde n é o comprimento deb
)Ou use
std::equal
(inclua<algorithm>
)Ex:
fonte
Deixe-me estender a solução de Joseph com a versão que não diferencia maiúsculas de minúsculas ( demonstração on-line )
fonte
o mesmo que acima, aqui está a minha solução
fonte
starts_with
que usar 'string :: compare'? Por que nãostd::equal(start.begin(), start.end(), str.begin())
?outra opção é usar regex. O código a seguir torna a pesquisa insensível a maiúsculas / minúsculas:
provavelmente não tão eficiente, mas fácil de implementar.
fonte
você pode usar string :: rfind
O exemplo completo com base nos comentários:
fonte
Verifique se str tem sufixo , usando abaixo:
fonte
Use o algoritmo std :: equal
<algorithms>
com a iteração reversa:fonte
Em relação à resposta de Grzegorz Bazior. Eu usei essa implementação, mas a original tem um bug (retorna true se eu comparar ".." com ".so"). Proponho função modificada:
fonte
Eu pensei que faz sentido postar uma solução bruta que não usa nenhuma função de biblioteca ...
Adicionando um simples
std::tolower
, podemos tornar este caso insensívelfonte
Encontrei esta boa resposta para o problema "startWith" semelhante:
Como verifico se um C ++ std :: string inicia com uma determinada string e converte uma substring em um int?
Você pode adotar a solução para pesquisar apenas no último lugar da string:
Dessa forma, você pode torná-lo curto, rápido, usar o c ++ padrão e torná-lo legível.
fonte
Se você é como eu e não gosta de purismo em C ++, aqui está um velho híbrido de skool. Há alguma vantagem quando as strings são mais do que um punhado de caracteres, pois a maioria das
memcmp
implementações compara palavras de máquina quando possível.Você precisa estar no controle do conjunto de caracteres. Por exemplo, se essa abordagem for usada com utf-8 ou tipo wchar, há alguma desvantagem, pois ela não suporta o mapeamento de caracteres - por exemplo, quando dois ou mais caracteres são logicamente idênticos .
fonte
Meus dois centavos:
fonte