Comment savoir si une chaîne se termine par une autre chaîne en C ++?
270
Comparez simplement les n derniers caractères en utilisant 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;
}
Utilisez cette fonction:
la source
std::equal(suffix.rbegin(), suffix.rend(), str.rbegin()
En mode débogage, il lance:_DEBUG_ERROR("string iterator not decrementable");
Utilisation
boost::algorithm::ends_with
(voir par exemple http://www.boost.org/doc/libs/1_34_0/doc/html/boost/algorithm/ends_with.html ):la source
Notez que partir de c ++ 20 std :: string fournira finalement begin_with et ends_with . Il semble qu'il y ait une chance qu'en c ++ 30 chaînes en c ++ puissent enfin devenir utilisables, si vous ne lisez pas ceci dans un avenir lointain, vous pouvez utiliser ces départs avec / fin avec:
et quelques surcharges auxiliaires supplémentaires:
IMO, les chaînes c ++ sont clairement dysfonctionnelles et n'ont pas été conçues pour être utilisées dans le code du monde réel. Mais il y a un espoir que cela s'améliorera au moins.
la source
Je connais la question pour C ++, mais si quelqu'un a besoin d'une bonne fonction C à l'ancienne pour le faire:
la source
La
std::mismatch
méthode peut servir cet objectif lorsqu'elle est utilisée pour effectuer une itération en arrière à partir de la fin des deux chaînes:la source
std::equal
: vous devez vérifier à l'avance que le suffixe supposé n'est pas plus long que la chaîne dans laquelle vous le recherchez. Négliger de vérifier cela conduit à un comportement indéfini.À mon avis, la solution C ++ est la plus simple:
la source
s
au lieu de simplement tester la fin de celle-ci!std::string::size()
est une opération à temps constant; il n'a pas besoinstrlen
.Soit
a
une chaîne etb
la chaîne que vous recherchez. Utiliseza.substr
pour obtenir les n derniers caractères dea
et les comparer à b (où n est la longueur deb
)Ou utiliser
std::equal
(inclure<algorithm>
)Ex:
la source
Permettez-moi d'étendre la solution de Joseph avec la version insensible à la casse ( démo en ligne )
la source
la même chose que ci-dessus, voici ma solution
la source
starts_with
utilise 'string :: compare'? Pourquoi ne passtd::equal(start.begin(), start.end(), str.begin())
?une autre option consiste à utiliser l'expression régulière. Le code suivant rend la recherche insensible aux majuscules / minuscules:
probablement pas aussi efficace, mais facile à mettre en œuvre.
la source
vous pouvez utiliser string :: rfind
L'exemple complet basé sur les commentaires:
la source
Vérifiez si str a un suffixe , en utilisant ci-dessous:
la source
Utilisez l'algorithme std :: equal
<algorithms>
avec une itération inverse:la source
Concernant la réponse de Grzegorz Bazior. J'ai utilisé cette implémentation, mais celle d'origine a un bug (retourne vrai si je compare ".." avec ".so"). Je propose une fonction modifiée:
la source
J'ai pensé qu'il était logique de publier une solution brute qui n'utilise aucune fonction de bibliothèque ...
En ajoutant un simple,
std::tolower
nous pouvons rendre ce cas insensiblela source
J'ai trouvé cette belle réponse au problème similaire "startWith":
Comment puis-je vérifier si une chaîne std :: C ++ commence par une certaine chaîne et convertir une sous-chaîne en int?
Vous pouvez adopter la solution pour rechercher uniquement à la dernière place de la chaîne:
De cette façon, vous pouvez le rendre court, rapide, utiliser le c ++ standard et le rendre lisible.
la source
Si vous êtes comme moi et que vous n'aimez pas le purisme C ++, voici un vieil hybride de skool. Il y a un avantage lorsque les chaînes sont plus d'une poignée de caractères, car la plupart des
memcmp
implémentations comparent les mots machine lorsque cela est possible.Vous devez contrôler le jeu de caractères. Par exemple, si cette approche est utilisée avec le type utf-8 ou wchar, il y a un inconvénient car elle ne prend pas en charge le mappage de caractères - par exemple, lorsque deux ou plusieurs caractères sont logiquement identiques .
la source
Mes deux centimes:
la source