【问题标题】:Counting a sequence in a string C language用 C 语言计算字符串中的序列
【发布时间】:2013-06-12 18:54:06
【问题描述】:

我正在尝试编写一个获取两个字符串的函数,一个称为 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;
}

【问题讨论】:

  • 您可以使用strstr
  • 你搞砸了你的索引。通过这些简短的输入,您可以写下 i、j 的值以及它们所指向的内容。你会发现你增加 i 太频繁了,而且你在实际检查字符串匹配之前就增加了 result(j 指向 'b',但 i 没有指向 str2 中的相应字符)。

标签: c string sequence


【解决方案1】:
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;
}

【讨论】:

    【解决方案2】:

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

    您的代码即将运行:

    • 您在访问str[...] 的代码中交换了ij - 您需要使用jstr2 访问str1i,而不是相反, 因为 i 上升到 strlen(str2)j 上升到 strlen(str1)
    • 发现不匹配时需要将j 重置为零 - 找到部分匹配后,ifelse 分支需要重置j

    这里是your modified code running on 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;
    }
    

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

    【讨论】:

    • 非常感谢!这正是我想要的。快把我逼疯了。原来我切换了 i 和 j ...我永远不会发现 ^^ 谢谢。它现在运行良好。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我想出了这个(不使用 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 2018-10-30
        • 2023-04-09
        • 1970-01-01
        相关资源
        最近更新 更多