5

文字列内の特定の文字の最後の出現を見つけて、物理的に文字列である文字の配列内の位置を返すために、私が書いたこの関数を考えてみてください。

size_t strlstchar(const char *str, const char ch)
{
    char *chptr = strrchr(str, ch);
    return chptr - str;
}

いくつかのことについて質問があるという理由だけで、ここにこれをすばやく入力しました(まだコンパイルも何もしていません)。

私には、これは特定の文字の最後のインスタンスを保持する配列要素を見つけるための最も簡単な解決策のように思えますが、それがどのように機能するかわかりません。strrchr のドキュメントに従ってこれを作成したので、技術的には strrchr がすべての作業を行っています。これが(パフォーマンスの観点から)これを達成するための最良の方法であるとは想像できません.

strrchr はこれを行う効率的な方法ですか? それとも、strrchr を他の用途に使用するのが最善でしょうか?

4

3 に答える 3

4

あなたが使用したアプローチはまったく問題ありません。残念ながら、配列操作は高価です。ほとんどの実装では、Strrchr は、一致する文字が見つかるまで、文字列の最後から順に単純に処理します。時間ですO(n)。次に、 である減算を実行しますO(1)。これはそれほど悪くはありません。

于 2012-08-28T20:34:15.540 に答える
3

ドキュメントから:

C 文字列 str 内で文字が最後に出現する位置へのポインターを返します。

したがって、それはまさにあなたが望むことを行います。その存在目的はこれです。

strrchr はこれを行う効率的な方法ですか?

ほぼ確実に、少なくとも自分で作成できるものと同じかそれ以上に作成されています。

それとも、strrchr を他の用途に使用するのが最善でしょうか?

いいえ、まさにこの目的のために書かれています。

于 2012-08-28T20:37:34.253 に答える
0

文字列の長さを指定できれば、逆方向にループするだけで高速になります。文字の最初の出現を見つけたら、すぐに戻ります。

長さがわからない場合は、strrchr を使用してください。

于 2012-08-28T20:38:57.780 に答える