2016-04-19 14 views
0

我不明白strncmp函數中下面的代碼究竟發生了什麼。爲什麼它(all+j*100)+i需要幫助瞭解什麼是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] 
} 

如果有人能詳細向我解釋for循環中發生了什麼,這將是非常好的。

+1

我有這種感覺,你應該去問實施'PatternSearch'的人。這就是說,他的評論很清楚。 –

+1

這是一個混淆的方式,讓函數在循環中使用'char(* all)[100]'並使用all [j] [i]' –

回答

-1

第一行的註釋解釋了這一切。數組all被分成100個字符的塊,並且參數j告訴從哪個塊開始尋找模式。 strncmp適用於從j th塊開始處開始的所有位置,直到數組結束。返回值是相對於j th塊的開始處發現模式的字符的偏移量。


是什麼(all+j*100)+i辦?

j*100獲得數組j的第一個元素的第一個元素的索引。也就是說,如果j是2,則獲得作爲第二塊的第一元素的索引的200(塊的開始處是第零塊)。

all+j*100&all[j*100]相同,所以它只是獲得指向我們討論的元素(或塊的開頭)的指針,在這種情況下爲&all[200]

最後+ii遞增指針,並且作爲i是循環的迭代器在第一輸入傳遞到strncmp()&all[200],然後&all[201],然後&all[202]等等,直到圖案被發現或數組的末尾到達了。

文字100的選擇,並用它來將數組分成塊,似乎是該功能的程序員所做的選擇。這真的不是必需的,你可以總是用j=0調用該函數,並且對於任何事情都可以正常地進行搜索而不使用該100。但是程序員可能知道在他的數組中,模式總是在數組中找到幾百個字符,所以他給了調用者開始尋找j模式的機會 - 數組中有100個字符,因此搜索速度更快。


- 想象一個字面5代替100爲簡單起見,:

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

如果參數作爲j=0通過,在循環的第一strncmp將與&arr[0]尋找稱爲在'a'字符處,第二個與&arr[1]查看'b'依此類推,直到找到該模式。它會在'g'&arr[6])上找到,所以返回將是6

如果參數爲j=1過去了,在循環的第一strncmp將與&arr[5]稱爲看'f'性格好,二&arr[6]看着'b',該模式會被發現,因此1將被退回。

+0

您能解釋一下'(all + j * 100)+ i )'做什麼?爲什麼我們會將這個數字減少100,我做了什麼? –

+0

用明確回答你的問題的章節編輯答案。 – atturri