2016-04-19 5 views
0

strncmp関数の以下のコードで正確に何が起こっているのか分かりません。なぜそれが(all+j*100)+iですか?誰かがforループで何が起こっているかを詳細に私に説明してくださいすることができればforループ内のstrncmp関数が何をしているのか理解する助けが必要です

/* Search jth string in char all[][100] for *pat*/ 
int PatternSearch(int j, char *all, char *pat) 
{ 

    int i; 

    for (i=0; i < strlen(all+j*100); i++) 
    { 
     if (strncmp(pat, ((all+j*100)+i), strlen(pat)) == 0) 
     { 
      return(i); // *pat found at ith byte of all[j] 
     } 
    } 

    return(-1); // *pat not found in all[j] 
} 

それは素晴らしいことです。

+1

私は、あなたが 'PatternSearch'を実装した人に尋ねるべきであるというこの感覚を持っています。しかし、彼のコメントはかなり明確です。 –

+1

ループ内で関数に 'char(* all)[100]'をとり、 'all [j] [i]'を使うのは難しい方法です。 –

答えて

-1

最初の行のコメントはすべて説明しています。配列allは100文字のチャンクに分割され、引数jはどのチャンクからパターンの検索を開始するかを指示します。 strncmpは、j番目のチャンクの先頭から、配列の末尾までのすべての位置に適用されます。戻り値は、j番目のチャンクの先頭を基準にしてパターンが見つかった文字のオフセットです。


(all+j*100)+iは何をしますか?

j*100は、配列のj番目のチャンクの最初の要素のインデックスを取得します。すなわち、jが2であれば、2番目のチャンクの最初の要素のインデックスである200を取得します(先頭のチャンクは0番目のチャンクです)。

all+j*100&all[j*100]と同じですので、私たちが話した要素(またはチャンクの先頭)へのポインタを取得しています。この場合は&all[200]です。パターンが見つかるまで

最後+iiによってポインタをインクリメントし、iように、第1のループの反復子がstrncmp()に入力を渡すされるように&all[200]こと、及びその後&all[201]、その後&all[202]とするか、または配列の終わりに達しました。

リテラル100を選択し、それを使って配列をチャンクに分割すると、関数のプログラマが選択するように見えます。それは本当に必要ではありません、あなたはいつもj=0と関数を呼び出すことができ、パターンのための検索は何でも100を使用せずに正常に行われるでしょう。しかし、プログラマはおそらく配列の中にパターンが数百文字あることを知っていたので、呼び出し元に配列j〜100文字を検索して検索が速くなるようにする機会を与えました。


- と、文字通りの5の代わりに、簡単にするために100を想像してみて:引数がj=0として渡された場合

arr = "abcdefghijklm"; 
pat = "gh"; 

、ループの最初のstrncmpは見&arr[0]で呼び出されます'a'文字の場合は&arr[1]で、パターンが見つかるまで'b'のように続きます。 'g'&arr[6])にありますので、返品は6となります。

引数がj=1として渡された場合、ループの最初のstrncmp'f'文字、&arr[6]はパターンが発見されるので、1が返されます'b'を見ていると第二を見&arr[5]で呼び出されます。

+0

'(all + j * 100)+ i ) 'そうですか?なぜ私たちは100倍になるのですか?+私は何をしますか? –

+0

あなたの質問に明示的に回答するセクションで回答を編集しました。 – atturri

関連する問題