2012-11-20 45 views
-1

出現的所有有找到非const的char *str2的所有出現(包括重疊)char *str1一個高效方式,並輸出匹配的數字位置中STR1在C(不是在C++,因爲它不同)?Ç找到的子串

+3

您是否需要重疊或不重疊的事件?你知道'strstr()'嗎?你有什麼嘗試? –

+0

這聽起來像你需要strstr()。 – imreal

+0

我需要包括重疊和我不知道strstr();) – NGix

回答

0

使用strstr()一個循環中:

int get_substr_count(const char * haystack, const char *needle) 
{ 
    int count = 0; 
    const char *tmp = haystack; 
    while(tmp = strstr(tmp, needle)){ 
     printf("Position: %d\n", (int)(tmp-haystack)); 
     ++count; 
    } 
    return count; 
} 
+0

計數比賽;這與打印比賽的位置不一樣。 –

+0

你應該在while循環中遞增tmp,否則這段代碼會進入無限循環,因爲它會繼續從同一個索引進行搜索。 – Jignesh

1

你的函數將使用strstr()while循環找到str2的第一場比賽中str1。然後您可以打印該匹配的偏移量。比賽結束後,你會繼續搜索第一個字符。當strstr()不再發現匹配時(由strstr()返回NULL表示),您將停止循環。

如果您需要不重疊,您需要知道str2的長度,並且您將開始下一個搜索匹配字符加上str2的長度。

+0

沒關係,但我正在尋找更高效的算法,例如後綴數組,因爲'str1'可以很長,程序執行時間有限 – NGix

+0

嘗試'strstr()';它可能很難被擊敗。至少在Mac OS X上,我在C中嘗試過BM和KMP,並且在性能方面沒有接近'strstr()'。我既驚訝又失望。你在ACGTAGGTCA類型字符串上進行'生物信息學'搜索嗎? –