2014-01-09 234 views
0

試圖編寫該函數檢查word中的所有字母是否出現在s中,順序相同。如果一個字母在word中出現多次,那麼它在s中應至少出現 多少次。字符串(C) - 比較兩個字符串的字母

例如:

containsLetters2("abcdef", "aaabbb") 

返回0,因爲有字母「a」後面的字母「b」的三次出現的無三次出現。

此:

containsLetters2("axaxxabxxbxbcdef","aaabbb") 

返回1

我不明白什麼是錯在我的代碼:

int containsLetters2(char *s, char *word) 
{ 
    int j,i, flag; 
    long len_word, len_s; 

    len_s=strlen(s); 
    len_word=strlen(word); 

    for (i=0; i<=len_word; i++) { 
     flag=0; 
     for (j=0; j<=len_s; j++) { 
      if (*word==*s) { 
       flag=1; 
       word++; 
       break; 
      } 
      s++; 

     } 

     if (flag==0) { 
      break; 
     } 
    } 
    return flag; 
} 


int main() { 
    char string3[MAX_STRING] , string4[MAX_STRING]; 


    printf("Enter 2 strings for containsLetters2\n"); 
    scanf ("%s %s", string3, string4); 
    printf("Return value from containsLetters2 is: %d\n",containsLetters2(string3,string4)); 

    return 0; } 
+0

它應該是這樣的for循環 - > 1) - > I Ĵ user2760375

+0

見也是[指向字符串C](http://stackoverflow.com/questions/21004727/pointers-to-string-c)的一個相關的,但截然不同的問題。 –

+0

你會如何處理''aababbb','aaabbb''?有3個,其次是3個B;中間體b是否阻止匹配工作? –

回答

0

下面的代碼可能無法編譯,但會做你想做的它要做的,希望它有幫助:

int containsLetters2(char *s, char *word) { 
    int lastIndex = 0; 
    for (int i = 0; i < strlen(word); i++) { 

     for (; lastIndex < strlen(s) && s[lastIndex] != word[i]; lastIndex++); 

     if (lastIndex == strlen(s)) { 
      return 0; 
     } 
    } 
    return 1; 
} 
2
for (i=0; i<=len_word; i++) { 
    flag=0; 
    for (j=0; j<=len_s; j++) { 
     if (*word==*s) { 

你有兩個明顯的問題。一個是一個錯誤。如果長度爲10,那麼你的代碼處理0到10的元素,這是11個元素,而不是10個。其次,你繼續比較*word*s。你想要的是word[i]s[j]相比。

還有很多問題不那麼明顯。我強烈建議你退後一步,並開始記錄你的代碼應該遵循的算法。這樣可以更容易地調試代碼,因爲您將確切知道它應該做什麼。

0

,應保留變量j, 例如價值,

word = "aaabbb" 
s = "axaxxabxxbxbcdef" 

的第一次迭代,word[1] == s[1],然後打破它,並在這個時候來到了第二個迭代, ,j重置爲零,和word[2] == s[1]

這是錯誤的。 如下更改您的代碼,看看是否有幫助,

i=j=0; 
for (; i<len_word; i++) { 
    flag=0; 
    for (; j<len_s; j++) { 
     if (*word==*s) { 
      flag=1; 
      word++; 
      break; 
     } 
     s++; 

    } 

    if (flag==0) { 
     break; 
    } 
}