std:stringが「xyz」で始まるかどうかを確認する必要があります。文字列全体を検索したり、substr()で一時的な文字列を作成したりせずにそれを行うにはどうすればよいですか。
回答:
私は比較方法を使用します:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
標準ライブラリの精神に沿ったアプローチは、独自の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());
}
これにより、クライアントコードへのインターフェースがシンプルになり、ほとんどの標準ライブラリコンテナーと互換性があります。
std :: string :: starts_withはC ++ 20内にあるようですが、std :: string :: findを使用できます
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
、文字列がリテラルで始まっているかどうかを確認するために、リテラル自体を繰り返さなくてもサイズを確認できるため、受け入れられている回答を使用するよりもはるかに優れています。C ++ 20ダイレクトソリューションをご紹介いただきありがとうございます。
私はあなたの質問を完全に理解しているとは思えません。それはささいなことのように見えます:
s[0]=='x' && s[1]=='y' && s[2]=='z'
これは、(最大で)最初の3文字のみを調べます。コンパイル時に不明な文字列の一般化では、上記をループに置き換える必要があります。
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
t
ます。