0

したがって、パトリシアを入力した場合 (トッパーに変換することを心配しないでください)、その文字列がベクターに読み込まれます。私の質問は、検索機能についてです。私は正しい文字をカウントダウンしていますか?したがって、私がパトリシアと入力し、j が ABBOT にある場合、PATRICIA のコンマの値は 5 になります。

bool NameSearch::findFirstNames(vector<string> &vsFirst, string name)
{ 

int j = 0;
bool bName = false;
vsFirst.clear();

while(j < total)
{  
    int comma;
    comma = names[j].find(',');

            //Confused here
    int found = names[j].find(name, comma);

    if(found > -1)  
    {
        vsFirst.push_back(names[j]);
        bName = true;
    }

        j++;
} 

return bName;
}
4

3 に答える 3

2

テストはif (found > -1)おそらくあなたのプラットフォームで動作しますが、技術的には疑わしいです.

の戻り値の型はstd::string::find()でありstd::string::size_type、検索している部分文字列が見つからない場合、戻り値は ですstd::string::npos(一方、部分文字列が見つかった場合、戻り値は最初に出現した文字インデックスです)。

ここで、std::string::npos値はたまたま type の可能な最大値でstd::string::size_typeあり、それが実装上にある場合、それはsigned intとunsigned intの比較でが得られることを意味します。-1true

ただし、一般に の型について仮定を行うことはできません。std::string::size_typeしたがって、テストを次のように書き直すことをお勧めします。

if (found != std::string::npos)
{
    ...
}
于 2013-02-10T18:38:01.943 に答える
1

これは誤解を招くコードです。 ではなく をstd::string::find()返します。size_tint

int comma;
comma = names[j].find(',');

これは誤解を招くコードです。std::string::find()失敗すると、 ではなくstd::string::nposを返します-1-1あなたの環境では、偶然に相当します。

if(found > -1)  

if ステートメントは、結果が見つからないことを確認することによって、「結果が見つかったかどうstd::string::nposか」を効果的にチェックしようとしています。

于 2013-02-10T18:37:52.693 に答える
0

このコードの何が問題なのかを指摘する他の2つの回答がありますが、作成者が何をしていたかを説明していないように感じます。それがあなたが望む説明です。:)

最初に次のスニペットを見てみましょう。

int comma;
comma = names[j].find(',');

ご指摘のとおり、次のように書き換える必要があります。

size_t comma;
comma = names[j].find(',');

findメソッドには 4 つのオーバーロードがありstd::string ます。上記のコードでは、次のものが使用されています。

size_t find (char c, size_t pos = 0) const;

最初の引数として渡された文字 (この場合は',') が文字列に表示されるインデックス、またはstd::string::nposその文字が見つからないインデックスを返します。どうやら作成者は、','その文字が文字列に存在する必要があると確信してnames[j]おり、結果をチェックしていません。

行で:

int found = names[j].find(name, comma);

これも次のように書き換える必要があります。

size_t found = names[j].find(name, comma);

findメソッドの次のオーバーロードが使用されます。

size_t find (const string& str, size_t pos = 0) const;

これはnames[j]、最初の引数として渡された文字列が最初に出現する文字列を検索し (あなたの場合nameは )、一致するかどうかにかかわらず、一致が開始するインデックスを返しますstd::string::npos

ご覧のとおり、前述のfindメソッドの両方のオーバーロードには、既定値が の 2 番目のパラメーターがあります0。この2番目のパラメーターにより、ユーザーは、検索された文字列の検索を開始するインデックスを指定できます(あなたの場合names[j]

呼び出し:

comma = names[j].find(',');

次の呼び出しと同等です。

comma = names[j].find(',', 0);

','つまり、文字列内の先頭から始まる文字を探し、その文字names[j]が最初に出現したインデックスを返すかstd::string::npos、その文字列にそのような文字がない場合は を返します。

呼び出し:

size_t found = names[j].find(name, comma);

name意味: string 内で に等しい部分文字列を探しますnames[j]が、コンマが見つかった位置から開始し、その部分文字列が最初に出現したインデックスを返しstd::string::nposます。その文字列にそのような部分文字列がない場合は、コンマの後に返します。

comma_position代わりにcomma、変数のより良い名前だったかもしれません。

于 2013-02-10T19:12:11.007 に答える