Как найти вхождения строки в строке в С++?

Как найти вхождения строки в строке в С++?

Вот сценарий.

string base_string = "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 to_find_occurances_of = "BF";

Ответ 1

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 берет строку для поиска в вызывающем объекте и (в этой перегрузке) позицию символа, в которой следует начинать поиск, и возвращает позицию вхождения строки, или string::npos, если строка не найден.

Переменная start начинается с 0 (первый символ) и в условии цикла, вы используете start, чтобы сообщить find, где начать искать, затем присвойте возвращаемое значение find в start. Увеличьте количество случаев; теперь, когда start содержит позицию строки, вы можете пропустить символы to_find_occurrences_of.length() 1 и начать искать снова.


1 drhirsch делает вывод, что если to_find_occurrences_of содержит повторяющуюся последовательность символов, выполнение start += to_find_occurrences_of.length() может пропустить некоторые вхождения. Например, если base_string был "ffff" и to_find_occurrences_of был "ff", тогда только 2 вхождения будут учитываться, если вы добавите to_find_occurrences_of.length() в start. Если вы хотите этого избежать, добавьте 1 вместо to_find_occurrences_of.length() в start, и в этом примере три вхождения будут считаться вместо двух.

Ответ 2

Здесь код для поиска строки в строке с пользовательской функцией поиска

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,"");
}    

Ответ 3

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