Найти количество вхождений для подстроки в строке с использованием C-программирования - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь программой на языке c прочитать текстовый файл, который содержит массив символов или строку, и найти количество вхождений подстроки с именем "GLROX" и сказать последовательность, найденную, когда она найдена.И «inputGLORX.txt» содержит в себе следующую строку:

GLAAAROBBBBBBXGLROXGLROXGLROXGLROXGLCCCCCCCCCCCCCCROXGGLROXGLROXGLROXGLROXGLROXGLROXGLROXGLROXGLROXGLROXGLROX

Но я получаю странные результаты.Было бы здорово, если бы какой-нибудь специалист по C-программированию помог мне решить эту проблему и заранее спасибо.

#include <stdio.h>
#include <conio.h>
#include <string.h>
#define NUMBER_OF_STRINGS 40
#define MAX_STRING_SIZE 7
void seqFound()
{
    printf("Sequence Found\n");
}

int main()
{
    FILE *fp;
    char buff[1000];
    char strptrArr[NUMBER_OF_STRINGS] [MAX_STRING_SIZE];
    const char *search = "GLROX";
    fp = fopen("D:/CandC++/inputGLORX.txt", "r");

    if(fp==NULL)
        printf("It is a null pointer");

    while(!feof(fp))
    {
      //fscanf(fp, "%s", buff);
      fgets(buff, 1000,fp);
    }

    int len = strlen(buff);
    printf("length is %d\n",len);
    int count = 0;
    char *store;

    while(store = strstr(buff, search))
    {
       printf("substring is %s \n",store);
       count++;
       search++;
    }

    printf("count is %d\n",count);
    while (count!=0) {
        seqFound();
        count--;
    }
    return 0;
}

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Неправильный способ поиска в buff, т. Е. Этот код:

while(store = strstr(buff, search))
{
   printf("substring is %s \n",store);
   count++;
   search++;  // <------- ups
}

Когда у вас есть удар, вы меняете search, то есть строку, которую вы ищете.Это не то, что вы хотите.Строка поиска (иначе игла) должна быть одинаковой все время.Вместо этого вы хотите двигаться вперед в буфере buff, чтобы вы могли искать в оставшейся части буфера.

Это может быть что-то вроде:

int main()
{

  const char* buff = "GLAAAROBBBBBBXGLROXGLROXGLROXGLROXGLCCCCCCCCCCCCCCROXGGLROXGLROXGLROXGLROXGLROXGLROXGLROXGLROXGLROXGLROXGLROX";

  const char* search = "GLROX";
  const char* remBuff = buff;    // Pointer to the remainder of buff
                                 // Initialized to be the whole buffer
  const char* hit;
  int cnt = 0;
  while((hit = strstr(remBuff, search)))  // Search in the remainder of buff
  {
    ++cnt;
    remBuff = hit + 1;    // Update the remainder pointer so it points just 1 char
                          // after the current hit
  }
  printf("Found substring %d times\n", cnt);
  return 0;
}

Вывод:

Found substring 15 times
1 голос
/ 27 сентября 2019

Как сказано в комментарии, в коде есть как минимум 2 проблемы: ваш fgets будет извлекать только последнюю строку (если она вообще получит одну? В любом случае, это не то, что вам нужно), ивы увеличиваете строку search вместо строки buff.

Что-то подобное должно решить большинство ваших проблем, если в вашем файле нет строк длиной более 999 символов.Это не будет работать должным образом, если вы используете символы \n или NULL в строке поиска.

int count = 0;
while (fgets(buff, 1000, fp) != NULL)
{
    char *temp = buff;
    while ((temp = strstr(temp, search)))
    {
        printf("%d. %s\n", count + 1, temp);
        count++;
        temp++;
    }
}

Вот основной пример для тестирования.Я использовал argv, чтобы обеспечить input.txt и search строку.

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

int main(int argc, char **argv)
{
    FILE    *fp;
    char    buff[1000];
    char    *search;

    if (argc < 3)
        return (-1);
    search = argv[2];
    if (search[0] == '\0')
        return (-1);
    if ((fp = fopen(argv[1], "r")) == NULL)
        return (-1);
    int count = 0;
    while (fgets(buff, 1000, fp) != NULL)
    {
        char *temp = buff;
        while ((temp = strstr(temp, search)))
        {
            printf("%d. %s\n", count + 1, temp);
            count++;
            temp++;
        }
    }
    printf("Match found: %d\n", count);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...