Как найти вхождения строки в строке в С++?
Вот сценарий.
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";
Как найти вхождения строки в строке в С++?
Вот сценарий.
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";
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 и начать искать снова.
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
, и в этом примере три вхождения будут считаться вместо двух. Здесь код для поиска строки в строке с пользовательской функцией поиска
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,"");
}
#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;
}