Подсчет подстрок в C - PullRequest
       45

Подсчет подстрок в C

1 голос
/ 30 сентября 2011

Мой друг нуждался в помощи для подсчета вхождений подстроки в строку, и я придумал следующий код. Кто-нибудь знает лучший способ сделать это?

#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 ]

4 голосов
/ 30 сентября 2011

как насчет этого: (используя функцию strstr, ссылка здесь )

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;
}
3 голосов
/ 30 сентября 2011

Пожалуйста, не используйте и не поощряйте использование 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;
}
0 голосов
/ 24 февраля 2015

Вы можете использовать QString в библиотеке QT

QString t = "yourstring";
t.count("yoursubstring");
0 голосов
/ 30 декабря 2013
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;
  }

Приведенный выше код работает, но он статический.

0 голосов
/ 30 сентября 2011

Возможно, вы захотите взглянуть на функцию strstr (если вы еще не знакомы с ней).

...