2010-12-02 73 views
0

我有以下功能:C:幫助與自定義strpos()函數

int strpos(const char *needle, const char *haystack) 
{ 
    int neLen, haLen, foundPos, nePos, i; 
    char temp; 

    neLen = strlen(needle); 
    haLen = strlen(haystack); 

    if(haLen < neLen) 
     return -1; 

    nePos = 0; 
    foundPos = -1; 
    i  = 0; 

    while((temp = *haystack++) != '\0' 
      && (i < (haLen-neLen+1) || foundPos > -1) 
      && nePos < neLen) 
    { 
     if(temp == *needle+nePos) 
     { 
      if(nePos == 0) 
       foundPos = i; 
      nePos++; 
     } 
     else 
     { 
      nePos = 0; 
      foundPos = -1; 
     } 

     i++; 
    } 

    return foundPos; 
} 

它可以正常工作,當我搜索了單個字符:

printf("Strpos: %d\n", strpos("a", "laoo")); // Result: "Strpos: 1" 

但它不恰當地使用更長的字符串:

printf("Strpos: %d\n", strpos("ao", "laoo")); // Result: "Strpos: -1" 

什麼問題?

獎勵問題:while循環正確地分成多行?接受的方式是什麼?

編輯:strlen()自然是一個自定義函數,它返回字符串的長度。這工作正常。

+0

最差。碼。永遠。 – Myforwik 2010-12-02 11:28:29

+0

這是作業嗎,還是我們真的獲得獎勵代表回答獎金問題? – MAK 2010-12-02 11:29:59

回答

1

的解決方案是標準的一聲,你的頭抵牆式功能於一個無限循環的 - 難怪 - 爲什麼 - 這是地獄 - 你是一個程序員。

if(temp == *needle+nePos) 

應該是:

if(temp == *(needle+nePos)) 
3

每次繞着循環,你都會從乾草堆中得到下一個字符。因此,如果在您將針與乾草堆的子字符串從位置0開始進行比較之後,針具有兩個字符,則草垛指針指向位置2(針對兩字符針)。

這意味着你跳過與草垛子比較針的位置開始1