2

我正在尝试编写一个获取两个字符串的函数,一个称为 str1 的短字符串和一个称为 str2 的较长字符串。

该函数将计算在 str2 中找到 str1 的次数。

example: str1= 'ab' str2 = 'abab' print 2

但出于某种原因,对于上面的例子。我得到 3。这是我的代码:

    int how_many_times(char* str1,char* str2)
{
    int result=0,i,j=0;
    for(i=0;i<strlen(str2);i++)
    {
        if((str1[i]==str2[j]))
        {
            while(str1[i]==str2[j])
            {
                j++;
                if(j==strlen(str1))
                {
                    result++;
                    j=0;
                }
                i++;
            }
        }
        else
            i++;
    }
    printf("%d",result);
    getch();
    return result;
}
4

4 回答 4

3
int count(char *s1, char *s2)
{
    char *p;
    int c;

    c = 0;
    for (p = strstr(s2, s1); p; p = strstr(p, s1)) {
        c++;
        p++;
    }
    return c;
}
于 2013-06-12T19:01:40.743 回答
2

由于这可能是一个学习练习,我不建议使用库函数,假设您宁愿修复您的代码。

您的代码即将开始工作:

  • 您在访问的代码中交换了iandjstr[...] - 您需要访问str1withjstr2with i,而不是相反,因为i上升到strlen(str2)j上升到strlen(str1)
  • 发现不匹配时需要重置j为零-找到部分匹配后需要重置的else分支。ifj

这是您在 ideone 上运行的修改后的代码

int how_many_times(char* str1,char* str2)
{
    int result=0,i,j=0;
    for(i=0;i<strlen(str2);i++)
    {
        if((str1[j]==str2[i])) // <<<=== Swapped i and j
        {
            while(str1[j]==str2[i]) // <<<=== Swapped i and j
            {
                j++;
                if(j==strlen(str1))
                {
                    result++;
                    j=0;
                }
                i++;
            }
        }
        else {
            i++;
            j = 0; // <<<=== Added
        }
    }
    return result;
}

基于 PS 库的解决方案更好:-)

于 2013-06-12T19:15:54.027 回答
1

strstr函数返回一个指针,该指针指向另一个字符串中第一次出现的字符串。count我们可以通过递增变量直到函数返回 NULL来使用它来计算出现次数。

int countOccur(char *a, char *b) {
  int count = 0;
  while (b = strstr(b, a)) {
    count++;
    b++;
  }

  return count;
}
于 2013-06-12T19:14:33.583 回答
1

我想出了这个(不使用strstr,但使用strlen):

int how_many_times(char *str, char *str2) {
    int result = 0, i = 0, j, k, len = strlen(str);

    while(str2[i]) {
        j = 0;
        k = 0;

        while(1) {
            if(str[j + k] == str2[i + k] && str[j] != 0) {
                if(j + k == len - 1) {
                    result++;
                    break;
                }
            } else {
                break;
            }
            k++;
        }

        i++;
    }

    return result;
}
于 2013-06-12T19:15:03.050 回答