在C中计算子串

时间:2011-09-30 14:24:38

标签: c count substring

我的一个朋友需要帮助计算字符串中子字符串的出现次数,我想出了以下代码。有没有人知道更好的方法呢?

#include "stdio.h"
#include "string.h"

int main(int argc, char *argv[])
{
    char str1[50], str2[50];
    int i, j, l1, l2, match, count;

    printf("String 1:\n");
    gets(str2);
    printf("String 2:\n");
    gets(str1);

    l1 = strlen(str1);
    l2 = strlen(str2);

    count = 0;

    for(i = 0; i < l1; i++)
    {
        match = 0;
        for(j = 0; j < l2; j++)
        {
            if(str1[i + j] == str2[j])
            {
                match++;
            }
        }

        if(match == l2)
        {
            count++;
        }
    }

    printf("Substrings: %d\n", count);
}

5 个答案:

答案 0 :(得分:4)

如何:(使用strstr函数,引用here

int count = 0;
char str1[50], str2[50];
char* tmp = str1;
int count;

printf("String 1:\n");
gets(str2);
printf("String 2:\n");
gets(str1);

while(*tmp != '\0' && (tmp = strstr(tmp, str2))) {
    ++count;
    ++tmp;
}

答案 1 :(得分:3)

不要使用或鼓励使用gets。除了在您的代码中引入故障点这一事实之外,它已从C99开始被弃用,并且将完全从C1X中消失。

正如其他人所说,strstr是你的朋友:

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

int main(void)
{
  char s1[50], s2[50];
  char *p;
  size_t count = 0;
  size_t len1;

  printf("Gimme a string: ");
  fflush(stdout);
  fgets(s1, sizeof s1, stdin);
  p = strchr(s1, '\n');          // get rid of the trailing newline
  if (p)
    *p = 0;

  printf("Gimme another string: ");
  fflush(stdout);
  fgets(s2, sizeof s2, stdin);
  p = strchr(s2, '\n');          // get rid of the trailing newline
  if (p)
    *p = 0;

  p = s2;
  len1 = strlen(s1);

  while ((p = strstr(p, s1)) != NULL && p != s1)
  {
    count++;
    p += len1;
  }

  printf("Found %lu occurrences of %s in %s\n", count, s1, s2);
  return 0;
}

答案 2 :(得分:0)

您可能需要查看strstr函数(如果您还不熟悉它)。

答案 3 :(得分:0)

int main()
  {
          char *str = "This is demo";
          char *sub = "is";
          int i,j,count;
          i=j=count=0;
          while(str[i]!='\0')
          {
           if (str[i] == sub[j] && str[i+1] == sub[j+1])
          {
                  count++;
          }
          i++;
          }
          cout<<count;
          return 0;
  }

以上代码有效,但这是静态的。

答案 4 :(得分:0)

您可以在QT库中使用QString

QString t = "yourstring";
t.count("yoursubstring");