2011-12-23 12 views

Odpowiedz

18
int occurrences = 0; 
string::size_type start = 0; 

while ((start = base_string.find(to_find_occurrences_of, start)) != string::npos) { 
    ++occurrences; 
    start += to_find_occurrences_of.length(); // see the note 
} 

string::find pobiera ciąg szukać w obiektu wywołującego i (w tym przeciążenia) pozycję znaku, w którym do rozpoczęcia poszukiwań i zwraca pozycję wystąpienia łańcucha, lub string::npos jeśli ciąg nie został znaleziony.

Zmienna start rozpoczyna się od 0 (pierwszy znak) oraz w stanie pętli użyć start powiedzieć find gdzie zacząć szukać, a następnie przypisać wartość zwracaną find do start. Zwiększ liczbę wystąpień; teraz, gdy start utrzymuje pozycję ciągu, możesz pominąć znaki to_find_occurrences_of.length() i zacząć ponownie szukać.


drhirsch sprawia, że ​​punkt, że jeśli to_find_occurrences_of zawiera powtarzające się sekwencje znaków, robiąc start += to_find_occurrences_of.length() może pominąć niektóre wystąpienia. Na przykład, jeśli base_string był "ffff" i to_find_occurrences_of był "ff", to tylko 2 wystąpienia byłyby policzone, jeśli dodasz to_find_occurrences_of.length() do start. Jeśli chcesz tego uniknąć, dodać 1 zamiast to_find_occurrences_of.length() do start, w tym przykładzie, 3 zdarzenia byłyby liczone zamiast tylko 2.

+0

będzie pominąć niektóre "wystąpień" jeśli _to_find_occurances_of_ składa powtarzających się znaków lub sekwencji. – hirschhornsalz

+0

@drhirsch dzięki, zaktualizowany –

+0

@SethCarnegie dzięki, jego działanie. – DreamCodeer

1
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
     string str("BF;1;2;3;FF;10;20;30;BF;11;;22;33;FF;100;200;300;BF;110;;220;330;FF;1000;2000;3000"); 
     string str2 ("BF"); 
     size_t found; 

     // different member versions of find in the same order as above: 
     found=str.find(str2); 
//print 

      return 0; 
} 
+0

Dzięki. Użyłem pierwszego. – DreamCodeer

+0

Co to jest size_t tutaj? –

3

Oto kod, aby znaleźć występowaniu gazów ciągu w ciągu znaków z definicją użytkownika Wyszukaj funkcja

int Find(char OrgStr[], char szFind[]); 

void main(){ 
    int iCount = Find("babbabaab ab", "ab"); 
    //cout<<"No of 'abe' : " << iCount <<endl; 

} 

int Find(char orgStr[], char findStr[]){  
    int i,j,k,l,szLen,orgLen; 
    char temp[] = " "; 

    orgLen = strlen(orgStr); 
    szLen = strlen(findStr); 

    k= 0; 
    i = 0; 
    l = 0; 

    while(l < orgLen) 
    { 
     i = (orgLen - (orgLen - l)); 
     for(j = 0; j < szLen; j++) 
     { 
      temp[j] = orgStr[i];    
      i++; 
     } 
     temp[j] = '\0'; 
     if(strcmp(temp,findStr) == 0) 
     { 
      k++; 
     } 
     strcpy(temp,""); 
     l++; 
    } 
    cout<<"No of 'ab' : " << k <<endl; 
    return k; 
    //strcpy(temp,""); 
}  
+0

Działa idealnie! Dzięki1 – G21

Powiązane problemy