どのように私はためstrstr()
のインプレース同等のCに(すなわちないヌルで終了)文字列をカウントしますか?はstrstr()
答えて
あなたはO(M * N)行動の恐れている場合 - 基本的に、あなたがする必要はありません、このような場合には、自然に発生しない - ここで私が変更したその周りに私が嘘をついていたKMPの実装があります乾草の長さを取る。またラッパー。繰り返し検索する場合は、自分で作成してborders
配列を再利用してください。
バグフリーネスは保証されていませんが、まだ動作しているようです。
int *kmp_borders(char *needle, size_t nlen){
if (!needle) return NULL;
int i, j, *borders = malloc((nlen+1)*sizeof(*borders));
if (!borders) return NULL;
i = 0;
j = -1;
borders[i] = j;
while((size_t)i < nlen){
while(j >= 0 && needle[i] != needle[j]){
j = borders[j];
}
++i;
++j;
borders[i] = j;
}
return borders;
}
char *kmp_search(char *haystack, size_t haylen, char *needle, size_t nlen, int *borders){
size_t max_index = haylen-nlen, i = 0, j = 0;
while(i <= max_index){
while(j < nlen && *haystack && needle[j] == *haystack){
++j;
++haystack;
}
if (j == nlen){
return haystack-nlen;
}
if (!(*haystack)){
return NULL;
}
if (j == 0){
++haystack;
++i;
} else {
do{
i += j - (size_t)borders[j];
j = borders[j];
}while(j > 0 && needle[j] != *haystack);
}
}
return NULL;
}
char *sstrnstr(char *haystack, char *needle, size_t haylen){
if (!haystack || !needle){
return NULL;
}
size_t nlen = strlen(needle);
if (haylen < nlen){
return NULL;
}
int *borders = kmp_borders(needle, nlen);
if (!borders){
return NULL;
}
char *match = kmp_search(haystack, haylen, needle, nlen, borders);
free(borders);
return match;
}
:ああああ、私は間違いなくこれを試してみよう!ありがとう! :) – Mehrdad
以下の機能が機能するかどうかを確認してください。私はそれを徹底的にテストしていないので、そうすることをお勧めします。
char *sstrstr(char *haystack, char *needle, size_t length)
{
size_t needle_length = strlen(needle);
size_t i;
for (i = 0; i < length; i++)
{
if (i + needle_length > length)
{
return NULL;
}
if (strncmp(&haystack[i], needle, needle_length) == 0)
{
return &haystack[i];
}
}
return NULL;
}
これは実際に私が現在使っているものと似ていますが、 '' strstr''は '' O(m + n)です。だから私は私のバージョンのように馬鹿げて遅くないものを探しています。 :-)しかし、とにかく、アイデアは動作するので、+1。 – Mehrdad
@Mehrdad:この実装を覗いてみる価値があるかもしれません:http://src.gnu-darwin.org/src/lib/libc/string/strnstr.c.html –
うわー、私は間違っていたと思いますそれで... 'strstr'は通常O(mn)演算であると定義されていますか?それを指摘してくれてありがとう...私は多分これを受け入れるでしょう、なぜならそれは質問のための正確な代案だからです。 – Mehrdad
私はちょうどこれに出くわしました、私は私の実装を共有したいと思います。それは私がサブコールを持っていないことは非常に速いと思う。
針が見つかったhaystackのインデックスを返します。見つからない場合は-1を返します。
/* binary search in memory */
int memsearch(const char *hay, int haysize, const char *needle, int needlesize) {
int haypos, needlepos;
haysize -= needlesize;
for (haypos = 0; haypos <= haysize; haypos++) {
for (needlepos = 0; needlepos < needlesize; needlepos++) {
if (hay[haypos + needlepos] != needle[needlepos]) {
// Next character in haystack.
break;
}
}
if (needlepos == needlesize) {
return haypos;
}
}
return -1;
}
あなたがそれに行っている間、先に行ってBoyer-Mooreにしてください;) –
- 1. strstr()function
- 2. parse_signed_request - base64_url_decode - はstrstr使用
- 3. strstrが機能しない
- 4. スイッチ内のstrstrの使用
- 5. emacs lispのstrstr()ですか?
- 6. PHPのはstrstr()関数の交換
- 7. パフォーマンスのstd :: STD対はstrstr ::文字列::
- 8. strstr()が指す値の変更。 C
- 9. strstr()関数のオーバーラップ文字列検索
- 10. strstrに画像を表示する
- 11. strstr PHPまたは別の部分文字列
- 12. Strstrが真ではなく偽を返す
- 13. Windowsカーネルモードでstrstrに相当するものはありますか?
- 14. PHP - はstrstr()私は私のDBにこれらのテーブルを持っているのMySQL
- 15. PHPがトリガーJSを返し、データをPHPに返す
- 16. 文字列フォーマットはfprintfで動作しますが、sprintfでは動作しません。セグメント化エラーが発生します。
- 17. Wordpressカスタム関数ヘルプ
- 18. 反対側のPHP関数、Iは、文字列、このような何か持って
- 19. リンクチェッカー - 無効なリンクのメール
- 20. iPad/iPhoneの場合は表示しない
- 21. PHPで配列キーを選択する
- 22. PHP switch-caseロジックの作業
- 23. チェック文字列が別のC
- 24. Vimの/他のエディタの一括編集
- 25. のRewriteCondはwww.ABC.comが</em>とき以外はwww.XYZ.com</p> <p>2)<em>にリダイレクトするに反対
- 26. PHPで値の配列を持つ検索文字列
- 27. 数値の合計が奇数小数を返しますか?
- 28. 2つの連続する文字のメモリブロックの検索
- 29. オンラインで異なるPHPスクリプトの動作
- 30. 私のPHP IF/ELSEステートメントは、ユーザーのオペレーティングシステムを決定するためには機能しません。なぜですか?
独自のバージョンを作成する必要があります。 –
どの文字列がNULLで終了していませんか?検索される文字列、またはサブ文字列? –
@TimCooper:検索対象(haystack)です。 – Mehrdad