2014-01-09 184 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; 
    } 
}