web-dev-qa-db-fra.com

std :: comparaison de chaînes (vérifiez si la chaîne commence par une autre chaîne)

J'ai besoin de vérifier si une chaîne std: commence par "xyz". Comment puis-je le faire sans rechercher dans toute la chaîne ou créer des chaînes temporaires avec substr ().

89
jackhab

J'utiliserais la méthode de comparaison:

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

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

Une approche qui pourrait être plus conforme à l'esprit de la bibliothèque standard serait de définir votre propre algorithme begin_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 pour le code client et est compatible avec la plupart des conteneurs de bibliothèque standard.

13
Neutrino

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

10
Alex Ott

Il semble que std :: string :: starts_with se trouve dans C++ 20, en attendant std :: string :: find peut être utilisé

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

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

J'ai l'impression de ne pas bien comprendre votre question. Il semble que cela devrait être trivial:

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

Cela ne regarde (au plus) que les trois premiers caractères. La généralisation d'une chaîne inconnue au moment de la compilation vous obligerait à 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
1800 INFORMATION