Respostas:
Eu usaria o método de comparação:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Uma abordagem que pode estar mais de acordo com o espírito da Biblioteca Padrão seria definir seu próprio algoritmo 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());
}
Isso fornece uma interface mais simples para o código do cliente e é compatível com a maioria dos contêineres da Biblioteca Padrão.
Olhe para a biblioteca String Algo do Boost , que tem uma série de funções úteis, como starts_with, istart_with (não diferencia maiúsculas de minúsculas), etc. Se você quiser usar apenas parte das bibliotecas boost em seu projeto, então você pode usar o utilitário bcp para copiar apenas arquivos necessários
Parece que std :: string :: starts_with está dentro de C ++ 20, entretanto std :: string :: find pode ser usado
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
pois torna mais fácil verificar se a string começa com um literal sem repetir o próprio literal para encontrar seu tamanho. E obrigado por apontar para a solução direta C ++ 20.
Sinto que não estou entendendo totalmente sua pergunta. Parece que deveria ser trivial:
s[0]=='x' && s[1]=='y' && s[2]=='z'
Isso só olha (no máximo) os três primeiros caracteres. A generalização para uma string desconhecida em tempo de compilação exigiria que você substituísse o acima por um loop:
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
t
.