このコードの何が問題なのかを指摘する他の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、変数のより良い名前だったかもしれません。