2011-07-25 12 views
1

strstr関数を使用して、文字列 'TT'がDNA配列ATGCTAGTATTTGGATAGATAGATAGATAGATAGATAGATAAAAAAATTTTTTTTに「T」を2回も数えずに表示される回数を数えようとしています。それは 'TT'の5つのインスタンスで出てくるはずですが、代わりに私の関数は私に9を与えています。これはあなたが 'TT'を重複した場合に得られるものです。どのようにして 'TT'の個々のインスタンスのみがカウントされ、Tが2回カウントされないように修正できますか?ここに私のプログラムは次のとおりです。strstr()関数のオーバーラップ文字列検索

/***************************************************************************************/ 
#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; 
} 

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

答えて

7

だけptr1 += strlen(ptr2);

0

にあなたのループ内ptr1++;を変更するには、単に天才

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; 
} 
+0

を試してみてください!ありがとう! – Arturo

+0

あなたを歓迎します:-) – Yahia

0
int count(char *haystack, char* needle) 
{  int c = 0; 
     for(;*haystack;haystack++){ 
      if(strcmp(haystack, needle)==0){ 
       c++; 
       haystack+=strlen(needle)-1; 
      } 
     } 
     return c; 
}