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 ().
J'utiliserais la méthode de comparaison:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
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.
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
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
}
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;
}