Поиск в строках
Класс stringсодержит большое количество перегруженных функций поиска подстрок и символов. Всегоstringсодержит шесть функции поиска и каждая из них перегружена, чтобы принимать в качестве аргументаstring,C-строку, массив символов и отдельный символ. Ниже приведены функции поиска, которые принимают в качестве параметраstring, описание остальных может быть найдено в литературе поC++:
template <class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch> >
class std::basic_string
{
public:
size_type find(const basic_string& str, size_type pos = 0) const;
size_type rfind(const basic_string& str, size_type pos = 0) const;
size_type find_first_of(const basic_string& str,
size_type pos = 0) const;
size_type find_last_of(const basic_string& str,
size_type pos = npos) const;
size_type find_first_not_of(const basic_string& str,
size_type pos = 0) const;
size_type find_last_not_of(const basic_string& str,
size_type pos = npos) const;
};
find() – ищет в строке подстроку и возвращает позициюпервоговхождения подстроки или жеnposв случае отсутствия совпадений, поиск начинается с позиции заданнойpos.
rfind() – ищет в строке подстроку и возвращает позициюпоследнеговхождения подстроки или жеnposв случае отсутствия совпадений, поиск начинается с позиции заданнойpos.
find_first_off() – возвращает позициюпервоговхождения любого символа изstr, а в случае отсутствия совпадений возвращаетnpos, поиск начинается с позиции заданнойpos.
find_last_off() – возвращает позициюпоследнеговхождения любого символа изstr, а в случае отсутствия совпадений возвращаетnpos, поиск начинается с позиции заданнойpos.
find_first_not_off() – возвращает позициюпервоговхождения символа отличного от всех символов содержащихся вstr, а в случае отсутствия совпадений возвращаетnpos, поиск начинается с позиции заданнойpos.
find_last_not_off() – возвращает позициюпоследнеговхождения символа отличного от всех символов содержащихся вstr, а в случае отсутствия совпадений возвращаетnpos, поиск начинается с позиции заданнойpos.
Пример работы функций find() иrfind():
string MyString("This is example of find and rfind usage.");
string StringToSearch(“is”);
int result = MyString.find(StringToSearch);
// result = 2
int result = MyString.find(StringToSearch,4);
// result = 5
int result = MyString.rfind(StringToSearch);
// result = 5
int result = MyString.rfind(StringToSearch,10);
// result = npos
}
Рассмотрим работу find_first_not_off() иfind_last_not_off() на примере программы, удаляющей пропуски с обоих концов строки.
#include<string>
#include<iostream>
using namespace std;
string trim(const string &s)
{
if(s.length() == 0)
return s;
int begin, end;
// поиск первого вхождения не пробельного символа
// под пробельным символом понимается пробел, табуляция,
// символ новой строки
begin = s.find_first_not_of("\a\b\f\n\r\t\v ");
// поиск последнего вхождения не пробельного символа
end = s.find_last_not_of("\a\b\f\n\r\t\v ");
if ((begin == string::npos)
|| (end == string::npos))
return "";
// создадим результирующую строку как подстроку,
// на основе результатов поиска
return string(s, begin, end – begin + 1);
}
int main(int argc, char ** argv)
{
string MyString(" User Information ");
cout << “->” << MyString << “<-” << endl;
MyString = trim(MyString);
cout << “->” << MyString << “<-” << endl;
return 0;
}
Вывод программы:
-> User Information <-
->User Information<-