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


90

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

回答:


164

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

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

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

3
単純にs.compare(t)を使用しないのはなぜですか?
フランクMesirard 2009年

5
@FranckMesirard:デフォルトでは、compareは渡された文字列全体をメンバーデータと比較してfalseを返しますが、渡されたパラメーターの長さとして長さを指定すると、trueを返します(std :: basic_string :: compareをオフセットと長さで使用すると、他のライブラリのString.BeginsWith()のように使用できます。オフセットと長さがなければ、これは当てはまりません。
legends2k

1
tが空の場合、これはtrueを返します。
グライダーカイト

14
@gliderkite当然ですが...空の文字列は、すべての文字列の最初のプレフィックスです。
ジムBalter

1
正しいので...空の文字列を除外したい場合:if(!t.empty()&&!s.compare(0、t.length()、t))
ericcurtin

14

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

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


涼しい!これをブーストに追加する必要があります!
デビッド

2
@David:boostが許可された依存関係である場合は、boost :: algorithm :: starts_with — 'Starts with'述語を参照してください
Gabor

10

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


4

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
}

1
これはstd::string::compare、文字列がリテラルで始まっているかどうかを確認するために、リテラル自体を繰り返さなくてもサイズを確認できるため、受け入れられている回答を使用するよりもはるかに優れています。C ++ 20ダイレクトソリューションをご紹介いただきありがとうございます。
ルスラン

s1がs2で始まっていない場合でも、後で一致させようとしますが、compare()ほど良くありません。
A117

0

私はあなたの質問を完全に理解しているとは思えません。それはささいなことのように見えます:

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

まあ、私はC関数を使用して文字列を比較する方法を知っています。私の質問は、C ++ STLを使用してオブジェクト指向の方法でそれを行うことでした。
jackhab 2009年

ここではC関数は使用されていません。そして、標準ライブラリはあなたがあなた自身の句読点を書くことを妨げません。

6
そしてtがsよりも短い場合はどうなりますか?
vidstige

@jackhab STLの作成者は、「STLはオブジェクト指向ではありません。オブジェクト指向は、人工知能とほぼ同じでっちあげだと思います。」- stlport.org/resources/StepanovUSA.html
ジムBalter

1
@vidstige次に、ループがの終了NULに遭遇すると終了しtます。
ジムバルター2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.