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