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

StackOverflow https://stackoverflow.com/questions/931827

  •  06-09-2019
  •  | 
  •  

Question

Je dois vérifier si un std: chaîne commence par « xyz ». Comment ça dois-je faire sans chercher à travers toute la chaîne ou la création de chaînes temporaires avec substr ().

Était-ce utile?

La solution

J'utiliser la méthode comparer:

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

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

Autres conseils

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

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

Rechercher Chaîne Algo bibliothèque du Boost, qui a un certain nombre de fonctions utiles, comme starts_with, istart_with (insensible à la casse), etc. Si vous voulez utiliser une partie seulement des bibliothèques Boost dans votre projet, vous pouvez utiliser l'utilitaire bcp pour copier des fichiers uniquement nécessaires

Il semble que std :: string :: starts_with est dans C ++ 20, quant à lui std :: string :: find peut être utilisé

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

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

Je me sens je comprends pas bien votre question. Il semble que ce devrait être trivial:

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

Ce ne regarde que (au plus) les trois premiers caractères. La généralisation d'une chaîne qui est inconnu au moment de la compilation serait nécessaire de remplacer ce qui précède avec 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top