Bir std: dizesinin "xyz" ile başlayıp başlamadığını kontrol etmem gerekiyor. Tüm dizede arama yapmadan veya substr () ile geçici dizeler oluşturmadan bunu nasıl yaparım.
Yanıtlar:
Karşılaştırma yöntemini kullanırdım:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Standart Kitaplığın ruhuna daha uygun olabilecek bir yaklaşım, algoritma ile kendi başlangıçınızı tanımlamak olacaktır.
#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());
}
Bu, istemci koduna daha basit bir arayüz sağlar ve çoğu Standart Kitaplık kapsayıcısı ile uyumludur.
Görünüşe göre std :: string :: starts_with, C ++ 20'nin içinde, bu arada std :: string :: find kullanılabilir
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
çünkü dizgenin, boyutunu bulmak için değişmezi tekrar etmeden bir değişmez ile başlayıp başlamadığını kontrol etmeyi kolaylaştırır. Ve C ++ 20 doğrudan çözümüne işaret ettiğiniz için teşekkür ederiz.
Sorunuzu tam olarak anlamadığımı hissediyorum. Önemsiz olması gerekiyor gibi görünüyor:
s[0]=='x' && s[1]=='y' && s[2]=='z'
Bu yalnızca (en fazla) ilk üç karaktere bakar. Derleme zamanında bilinmeyen bir dizge için genelleme, yukarıdakileri bir döngü ile değiştirmenizi gerektirir:
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
t
.