§ 9. Строковые величины

9.3. Поиск в строке

Современные компьютерные устройства позволяют достаточно быстро осуществлять поиск в тексте, используя для этого различные алгоритмы. Языки программирования предоставляют для алгоритмов широкий набор функций для работы с текстом.

В классе string реализовано несколько различных функций, которые позволяют осуществлять поиск символа или подстроки (части строки) в строке. В качестве результата получаем номер первого вхождения искомого образца или значение –1, если образец не найден. Значение –1 поисковые функции возвращают только для компилятора MinGW. Универсальным возвращаемым значением, которое поддерживается компиляторами по стандарту, является константа string::npos.

Функции могут осуществлять просмотр символов слева направо или справа налево. Некоторые из функций представлены в таблице:

Функция

Описание
length() Определяет длину строки (количество символов в строке)
find(s1) Определяет позицию подстроки s1
rfind(s1) Определяет позицию последнего (первого при просмотре справа налево) вхождения подстроки s1
find(s1,from) Определяет позицию подстроки s1. Поиск начинается с позиции from

Более подробно с функциями для работы со строками можно ознакомиться в приложении.

В примере 9.6. показано, как применять указанные функции.

Пример 9.7. Написать программу, которая вводит слово, а затем выводит его по одному символу в строке.

Этапы выполнения задания

I. Исходные данные: переменная s — исходное слово.

II. Результат: слово на экране, каждый символ в отдельной строке.

III.  Алгоритм решения задачи.Описание переменных: s – string, n – int.

1. Вводим исходные данные. 
2. Определяем длину слова. Переменной n присваиваем значение функции length() 
3. В цикле for выводим по одному символы введенного слова.

Пример 9.8. Написать программу, которая выводит на экран последний символ введенного слова и определяет, встречается ли этот символ в слове еще раз. Если встречается, то программа выводит индекс этого символа.

Этапы выполнения задания

I. Исходные данные: переменная s — введенное слово.

II. Результат: последний символ в слове и соответствующее сообщение: встречается или не встречается.

III.  Алгоритм решения задачи.

1. Ввод исходных данных.
2. 
Определим длину слова. Переменной n присваиваем значение функции length.
3. 
В цикле for выводим по одному символу введенного слова.
4. 
Определим последний символ.
5. 
Определим позицию последнего символа в слове. Переменной k1 присваиваем значение функции find для поиска последнего символа. Переменной k2 присваиваем значение функции rfind для последнего символа.
Если k1 = k2, то символ в слове единственный, иначе в слове есть другой такой же символ.
6. Вывод результата.

 IV. Описание переменных: s — string, n, k1, k2 — int.

Язык С++ является объектно-ориентированным языком. Тип данных string не является частью языка С++, а реализован как шаблонный класс, входящий в стандартную библиотеку STL. С понятием класса вы познакомитесь позже. При описании класса определяется не только способ хранения данных, но и методы обработки этих данных. Методы реализованы в виде функций, доступ к которым имеет любая переменная, являющаяся объектом данного класса. Для вызова функции ее имя указывают после имени переменной, разделяя их точкой. Например: s.length(), s.find('*') и др. В окне редактора кода список функций, относящихся к переменной типа string, может открываться, когда после имени переменной поставили точку. После чего функцию можно выбрать из списка.

Для того чтобы список функций появился в Code::Bloks, нужно прописать дополнительное пространство имен:

   using namespace std::__cxx11;  

Пример 9.6. Примеры использования функций.

string s ="informatics";

int n = s.length();

n=11

 string s ="Не слово хозяин хозяину, 
            а хозяин слову хозяин"
;

 string s1 = "хозяин";

 int n = s.length();

 int p1 = s.find(s1);

 int p2 = s.rfind(s1);

 int p3 = s.find(s1, 14);

n=46

p1=9

p2=40

p3=16

 

Пример 9.7.

V. Программа:

#include <iostream>

#include <string>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  string s;

  cout << "slovo" << endl;

  cin >> s;

  int n = s.length();

  for (int i = 0; i< n; i++)

    cout << s[i] << endl;

  return 0;

}

VI. Тестирование.

Пример 9.8.

V. Программа:

#include <iostream>

#include <string>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  string s;

  cout << "slovo" << endl;

  cin >> s;

  int n = s.length();

  int k1 = s.find(s[n-1]);

  int k2 = s.rfind(s[n-1]);

  if (k1 ==k2)

    cout << " 1 raz" << endl;

  else

     cout << "est, pos - " << k1 << endl;

  return 0;

}

IV. Тестирование.