90 votes

std::string comparaison (vérifie si la chaîne de caractères commence par une autre chaîne)

Je dois vérifier si une chaîne std:string commence par "xyz". Comment puis-je le faire sans chercher dans toute la chaîne ou créer des chaînes temporaires avec substr().

164voto

Wacek Points 2055

J'utiliserais la méthode de comparaison :

std::string s("xyzblahblah");
std::string t("xyz")

if (s.compare(0, t.length(), t) == 0)
{
// ok
}

0 votes

J'avais oublié de comparer - c'est la meilleure méthode, mais il n'est pas nécessaire d'utiliser c_str(0 pour obtenir une chaîne de caractères.

0 votes

Vous pouvez aussi faire chaîne s("xyz") == "xyz" :)

0 votes

Neil, vous avez tout à fait raison, j'ai édité la réponse et supprimé l'appel à c_str()

14voto

Neutrino Points 1261

Une approche qui serait plus conforme à l'esprit de la bibliothèque standard serait de définir votre propre algorithme 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());
}

Cela fournit une interface plus simple au code client et est compatible avec la plupart des conteneurs de la bibliothèque standard.

0 votes

Cool ! Cela devrait être ajouté à Boost !

2 votes

@David : Si boost est une dépendance autorisée, voir boost::algorithm: : commence_avec - Prédicat "commence par".

10voto

Alex Ott Points 14329

Regardez dans les Boost's Algo de cordes qui possède un certain nombre de fonctions utiles, telles que starts_with, istart_with (insensible à la casse), etc. Si vous souhaitez utiliser une partie seulement des bibliothèques de boost dans votre projet, vous pouvez utiliser l'utilitaire bcp pour copier uniquement les fichiers nécessaires.

4voto

Il semble que std::string::starts_with soit dans C++20, alors que std::string::find peut être utilisé.

std::string s1("xyzblahblah");
std::string s2("xyz")

if (s1.find(s2) == 0)
{
   // ok, s1 starts with s2
}

0voto

1800 INFORMATION Points 55907

J'ai l'impression de ne pas bien comprendre votre question. Il semble qu'elle devrait être triviale :

s[0]=='x' && s[1]=='y' && s[2]=='z'

Cela ne porte que sur les trois premiers caractères (au maximum). La généralisation pour une chaîne inconnue au moment de la compilation nécessiterait de remplacer ce qui précède par une boucle :

// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
  if (s[i]!=t[i])
    return false;
}

0 votes

Eh bien, je sais comment comparer des chaînes de caractères en utilisant les fonctions C. Ma question était de savoir comment le faire de manière orientée objet au moyen de la STL C++.

0 votes

Il n'y a pas de fonction C utilisée ici. Et la bibliothèque standard ne vous empêche pas d'écrire vos propres fonctions.

6 votes

Et si t est plus court que s ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X