Функция strstr () для поиска перекрывающихся строк - PullRequest
1 голос
/ 25 июля 2011

Я пытаюсь использовать функцию strstr, чтобы подсчитать, сколько раз строка «ТТ» появляется в последовательности ДНКДолжно получиться 5 экземпляров «ТТ», но вместо этого моя функция дает мне 9, что вы и получили бы, если бы перекрыли «ТТ».Как я могу исправить это так, чтобы учитывался только каждый отдельный экземпляр «ТТ», а Т не учитывался дважды?Вот моя программа:

/***************************************************************************************/
#include <iostream>    
#include <cstring>      
#include <iomanip>

using namespace std;

    //FUNCTION PROTOTYPES
     int overlap(char *ptr1, char *ptr2);

int main()
{

    //Declare and initialize objects
   int count(0); // For DNA sequence

        //DNA SEQUENCE
    char DNA_sequence[] = "ATGCTAGTATTTGGATAGATAGATAGATAGATAGATAGATAAAAAAATTTTTTTT";
    char thymine_group[] = "TT";
    char *ptr1(DNA_sequence), *ptr2(thymine_group);

//Send QUOTE to function
count = overlap(ptr1, ptr2);

   //Print number of occurences.
    cout << "'TT' appears in DNA sequence " << count << " times" << endl;
    return 0;
}

//FUNCTION 1 USING CHAR ARRAYS AND POINTERS

int overlap(char *ptr1, char *ptr2)
{
    int count(0);
    //Count number of occurences of strg2 in strg1.
    //While function strstr does not return NULL
    //increment count and move ptr1 to next section
    //of strg1.
    while ((ptr1=strstr(ptr1,ptr2)) != NULL)
    {
        count++;
        ptr1++;
    }
    return count;
}

/**************************************************************************************************/

Ответы [ 3 ]

7 голосов
/ 25 июля 2011

Просто измените ptr1++; в вашем цикле на ptr1 += strlen(ptr2);

0 голосов
/ 25 июля 2011
int count(char *haystack, char* needle)
{       int c = 0;
        for(;*haystack;haystack++){
            if(strcmp(haystack, needle)==0){
                 c++;
                 haystack+=strlen(needle)-1;
            }
        }
        return c;
}
0 голосов
/ 25 июля 2011

попробуй

int overlap(char *ptr1, char *ptr2)
{
    int count(0);
    //Count number of occurences of strg2 in strg1.
    //While function strstr does not return NULL
    //increment count and move ptr1 to next section
    //of strg1.
    while ((ptr1=strstr(ptr1,ptr2)) != NULL)
    {
        count++;
        ptr1 += strlen (ptr2);
    }
    return count;
}
...