Поиск подстроки в строке C ++ (найти «el» в «hello»)

Итак, я искал алгоритм, который мог бы помочь мне найти строку в подстроке.
Код, который я использовал раньше, был от аналогичный вопрос но он этого не делает.

// might not be exposed publicly, but could be
int index_of(string const& haystack, int haystack_pos, string const& needle) {
// would normally use string const& for all the string parameters in this
// answer, but I've mostly stuck to the prototype you already have

// shorter local name, keep parameter name the same for interface clarity
int& h = haystack_pos;

// preconditions:
assert(0 <= h && h <= haystack.length());

if (needle.empty()) return h;
if (h == haystack.length()) return -1;
if (haystack.compare(h, needle.length(), needle) == 0) {
return h;
}
return index_of(haystack, h+1, needle);
}

int index_of(string haystack, string needle) {
// sets up initial values or the "context" for the common case
return index_of(haystack, 0, needle);
}

это не возвращает начальный индекс «el» в строке «привет», и я не могу понять это.

РЕДАКТИРОВАТЬ:
Хорошо, позвольте мне показать вам немного больше кода, включая примеры из реальной жизни:
Я пытаюсь проанализировать строку, которая является путем к файлу, который я хочу отсортировать в моей файловой системе.
Пример ввода такой:

ввод: /media/seagate/lol/Sons.of.Anarchy.S04.720p.HDTV.x264/Sons.of.Anarchy.S04E01.720p.HDTV.x264-IMMERSE.mkv

когда я пытаюсь разобрать эту строку, чтобы получить имя, обнаруживая присутствие SxxExx, я ищу «s0», «S0» и т. д. (я знаю, что это не лучшая реализация, которую я просто пытался увидеть, работает ли она и посмотрим на код позже). Поэтому, когда я использую этот вход, я получаю на выходе:

input:/media/seagate/lol/Sons.of.Anarchy.S04.720p.HDTV.x264/Sons.of.Anarchy.S04E01.720p.HDTV.x264-IMMERSE.mkv

aux: 0p.HDTV.x264-IMMERSE.mkv

input:/media/seagate/lol/Sons.of.Anarchy.S04.720p.HDTV.x264/Sons.of.Anarchy.S04E01.720p.HDTV.x264-IMMERSE.mkv

aux: 1.720p.HDTV.x264-IMMERSE.mkv

input:/media/seagate/lol/Sons.of.Anarchy.S04.720p.HDTV.x264/Sons.of.Anarchy.S04E01.720p.HDTV.x264-IMMERSE.mkv

aux: 264-IMMERSE.mkv

предполагаемый выход для aux: S04E01.720p.HDTV.x264-IMMERSE.mkv

Итак, как вы можете видеть, он просто ищет любой символ, который находится в строке и останавливается, что также учитывает несколько действительных «найденных», которые должны были быть только теми.

полный код, где я пытаюсь использовать это:

bool StringWorker::isSeries(size_t &i) {

size_t found1, found2, found3, found4, found5, found6;
found1 = input->find_last_of("S0"); //tried several find functions including the
found2 = input->find_last_of("S1"); //index_of() mentioned above in the post
found3 = input->find_last_of("S2");
found4 = input->find_last_of("s0");
found5 = input->find_last_of("s1");
found6 = input->find_last_of("s2");

if (found1 != string::npos) {
if (input->size() - found1 > 6) {
string aux = input->substr(found1, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found1;
return true;
}
}
}
if (found2 != string::npos) {
if (input->size() - found2 > 6) {
string aux = input->substr(found2, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found2;
return true;
}
}
}

if (found3 != string::npos) {
if (input->size() - found3 > 6) {
string aux = input->substr(found3, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found3;
return true;
}
}

}
if (found4 != string::npos) {
if (input->size() - found4 > 6) {
string aux = input->substr(found4, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found4;
return true;
}
}

}
if (found5 != string::npos) {
if (input->size() - found5 > 6) {
string aux = input->substr(found5, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found5;
return true;
}
}

}
if (found6 != string::npos) {
if (input->size() - found6 > 6) {
string aux = input->substr(found6, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found6;
return true;
}
}

}

return false;

}

Вы видите здесь что-то не так?

2

Решение

Почему бы вам не использовать find() метод std::string -> ссылка на сайт.

6

Другие решения

Этот код возвращает индекс через index = sub_str.find("el"):

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

int main ()
{
string sub_str="abc def ghi jk lmnop  hello";

string sub_str2;
size_t index;index = sub_str.find("el");
sub_str2 = sub_str.substr (index);

cout<<"index = "<<index<<"\n";
cout<<sub_str2<<"\n";

return 0;
}
3

Для поиска подстроки и ее индекса в строке вы можете попробовать это —

int find_sub(const std::string& mstring,sub)
{
int lensub=sub.length(),len=mstring.length(),f=0,pos;
std::string b="";
for(int i=0;i<len-lensub;i++)
{
for(int j=i,k=0;j<i+lensub;j++,k++)
b[k]=mstring[j];
if(b.compare(sub)==0)
{
f=1;
pos=i;
break;
}
}
if(f==1)
cout<<"substring found at: "<<pos+1;
else
cout<<"substring not found!";
return f;
}

Вы также проверяете, сколько раз появляется подстрока, удаляя break; и увеличивая значение f каждый раз. Также получите их индексы, преобразовав pos в массив.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector