2015-11-07 24 views
0

我的任務是編寫一個程序來計算另一個字符序列中字符序列出現的次數。 '模式'函數應該返回第二個序列中第一個序列發生的次數而不重複。由於這是一個編程練習,我不允許使用括號來解引用指針,並且只能使用指針算術。陣列中的模式發生

我決定使用if語句來查看序列是否出現在數組中。我很難看到我的問題在哪裏。我打印出pValue1以查看指針在陣列中的位置。任何幫助,將不勝感激。

#include <stdio.h> 
#include <string.h> 

int pattern(char *ptr1, char *ptr2) 
{ 
char *pValue1 = ptr1; 
char *pValue2 = ptr2; 
int count = 0; 
int occurrence = 0; 

while (*pValue1 != '\0') 
{ 
    if (*pValue1 == *pValue2) 
    { 
     if (*pValue1++ == *pValue2++) 
     { 
      if (*pValue1 + 2 == *pValue2 + 2) 
      { 
       printf("Occurence happens at Location: %d", count); 
       occurrence++; 

      } 
     } 
    } 
    count++; 
    pValue1 = pValue1 + count; 
    printf("%d", pValue1); 
} 
/* Print number of occurrences. */ 
printf("number of occurrences: %i \n", occurrence); 


} 


void main() 
{ 
char array1[] = "1','1','0','1','0','0','1','1','1','0','1','1','\0'"; 
char array2[] = "'1','0', '1', '\0'"; 


pattern(array1, array2); 
getchar(); 
getchar(); 
} 
+0

(我假設這是一個純粹的編程練習,所以我說的「我不允許」,以防止評論中的「誰不讓靜脈的理由提示:'hoge = array1 [i];' - >'{char * p = array1 + i;你會怎樣?「和」你會受到懲罰,如果你這樣做的話「) – usr2564301

+0

提示: hoge = * p;}'另外,我認爲你應該避免使用'void main()'並使用標準的'int main(void)'。 – MikeCAT

+0

注意:'* pValue1!='\ 0''可以更簡潔和慣用地表示爲'* pValue1';在C中,零是假的,非零是真的。 –

回答

2

您的比較代碼相當混亂。此行可能沒有達到您期望的效果:

if (*pValue1 + 2 == *pValue2 + 2) 

它取消引用每個指針,然後將結果添加2。我想你 打算在:

if (*(pValue1 + 2) == *(pValue2 + 2)) 

以作爲意圖,代碼仍然是錯誤的。首先,你比較 在字符[0]:

if (*pValue1 == *pValue2) 

然後你遞增指針,並且比較在[1]中的字符:

if (*pValue1++ == *pValue2++) 

然後,你檢查的字符[3] :

if (*(pValue1 + 2) == *(pValue2 + 2)) 

所以,你跳過[2],你只是檢查幾個字符。你 需要一個循環來檢查第一個字符串中的所有內容,並檢查第二個字符串中檢查的點 。

另外,你似乎打電話pattern()檢查整個第二個 字符串?但是,你只是檢查它的開始。您需要一個外部循環遍歷第二個字符串的每個部分。

main()的第一行通常會被寫成這樣:

char array1[] = "110100111011"; 
char array2[] = "101"; 

我還建議重新命名參數needlehaystack,以 使代碼更易讀。

2

使用指針算術通常是一種痛苦,因爲使用指針通常是危險的,需要額外注意以避免問題。我建議你達成一個可能的解決方案,制定更小的步驟,並確保你已經理解了每一個。

讓我們先從你的程序的骨架:

#include <stdio.h> 

/* declaration of functions */ 

int main(void) { 

/* declaration of global variables */ 
/* main stuff */ 

return 0; 
} 

您與空終止字符數組工作,你可以聲明,在許多方面對它們進行初始化(你但不知道如何做的?):

/* declaration of global variables */ 

char source[] = "110100111011";    
char pattern[] = { '1', '0', '1', '\0' }; 

爲了解決你的任務,我將實現一個簡單的(但低效的)算法,而是跳轉到實際功能之前,我會嘗試寫一些東西輕鬆地測試(太礦)的理解指針。例如,編寫一個函數來計算這些數組中有多少個字符用於空終止符。 如果你不能,看看這個例子:

int charArrayLength (char * str) { 
    char * pch; 

    if (str) { 
     pch = str; 
     while (*pch) pch++; 
     return pch - str; 
    } 
    else return 0; 
} 

注意它是如何檢查作爲參數傳遞的指針使用它之前,它如何使用這些算法,計算長度。這是醜陋的,但它似乎工作。 如果它全部清楚(並且經過測試!總是確保函數完成它的工作),讓我們繼續前進並編寫一個函數,該函數搜索數組中的字符並將其第一次出現的位置作爲整數返回(如果不是):

int posCharInString (char * c, char * str) { 
    char * p; 

    if (str && c) { 
     p = str; 
     while (*p) { 
      if (*p == *c) return p - str; 
      p++; 
     } 
    } 
    return -1; 
} 

再次,測試它,並嘗試瞭解它是如何工作的(或爲什麼它不...)。現在我們更接近了。讓我們改造這個功能,使得它可以搜索的陣列內的字符序列,並返回一個整數其第一次出現的位置(或-1,如果不):

int posStringInString (char * pat, char * str) { 
char * p; 
char * s; 
char * k; 

if (str && pat) { 
    p = str; 
    while (*p) { 
     s = pat; 
     k = p; 
     do { 
      if (*s == *k) { 
       s++; 
       k++; 
      } else break; 
     } while (*s && *k); 
     if (*s) p++; 
     else return p - str; 
    } 
} 
return -1; 
} 

我加入嵌套循環來檢查corrispondence。現在,我們只需要找出所有出現,我會用另一種功能,它調用了最後一個:

int occurrenceOfStringInString (char * pat, char * str) { 
    int sum = 0; 
    int pos = 0; 
    int posrel = posStringInString(pat,str); 

    while (posrel != -1) { 
     pos += posrel; 
     sum++; 
     printf("Occurrence: %i, position: %i\n",sum,pos); 
     ++pos; 
     posrel = posStringInString(pat,str + pos); 
    } 
    return sum; 
} 

注++ POS開始從下一個位置搜索。就是這樣,只是重寫我們的主:

int main(void) { 
    char sequence[] = "110100111011"; 
    char pattern[] = "101"; 

    printf("Total occurrences: %i\n",occurrenceOfStringInString(pattern,sequence)); 

    getchar(); 

    return 0; 
}