Muszę sprawdzić, czy ciąg std: zaczyna się od „xyz”. Jak to zrobić bez przeszukiwania całego ciągu lub tworzenia tymczasowych ciągów za pomocą funkcji substr ().
Odpowiedzi:
Użyłbym metody porównawczej:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Podejściem, które mogłoby być bardziej zgodne z duchem Biblioteki Standardowej, byłoby zdefiniowanie własnego algorytmu begin_withm.
#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());
}
Zapewnia to prostszy interfejs do kodu klienta i jest kompatybilny z większością kontenerów biblioteki standardowej.
Zajrzyj do biblioteki Boost's String Algo , która ma wiele przydatnych funkcji, takich jak start_with, istart_with (bez rozróżniania wielkości liter) itp. Jeśli chcesz używać tylko części bibliotek boost w swoim projekcie, możesz użyć narzędzia bcp do kopiowania tylko potrzebne pliki
Wygląda na to, że std :: string :: started_with znajduje się wewnątrz C ++ 20, tymczasem można użyć std :: string :: find
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
ponieważ ułatwia sprawdzenie, czy ciąg zaczyna się od literału, bez konieczności powtarzania samego literału w celu znalezienia jego rozmiaru. Dziękujemy za wskazanie bezpośredniego rozwiązania C ++ 20.
Czuję, że nie rozumiem w pełni twojego pytania. Wygląda na to, że powinno być trywialne:
s[0]=='x' && s[1]=='y' && s[2]=='z'
Dotyczy to tylko (najwyżej) pierwszych trzech znaków. Uogólnienie dla łańcucha, który jest nieznany w czasie kompilacji, wymagałoby zastąpienia powyższego pętlą:
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
t
.