web-dev-qa-db-ja.com

std :: string比較(文字列が別の文字列で始まるかどうかを確認します)

Std:stringが「xyz」で始まるかどうかを確認する必要があります。文字列全体を検索したり、substr()で一時的な文字列を作成したりせずに、どうすればよいですか。

89
jackhab

私は比較方法を使用します:

std::string s("xyzblahblah");
std::string t("xyz")

if (s.compare(0, t.length(), t) == 0)
{
// ok
}
161
Wacek

標準ライブラリの精神にもっと沿ったアプローチは、独自のbegins_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());
}

これにより、クライアントコードへのよりシンプルなインターフェイスが提供され、ほとんどの標準ライブラリコンテナと互換性があります。

13
Neutrino

Boostの String Algo ライブラリに注目してください。これには、starts_with、istart_with(大文字と小文字を区別しない)などの便利な関数が多数あります。プロジェクトでboostライブラリの一部のみを使用する場合は、 bcpユーティリティを使用して、必要なファイルのみをコピーできます

10
Alex Ott

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
}
2

私はあなたの質問を完全に理解していないと感じています。些細なことのように見えます:

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;
}
0