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

Перечислим методы, предназначенные для поиска в строке:

  • find() — производит поиск символа или фрагмента с начала строки. Возвращает индекс первого совпадения, если фрагмент найден, или значение константы npos — в противном случае. Поиск зависит от регистра символов. Прототипы метода:
size_type find(_CharT ch, size_type pos=0) const noexcept;
size_type find(const _CharT *str,
               size_type pos=0) const noexcept;
size_type find(const _CharT *str, size_type pos,
               size_type count) const noexcept;
size_type find(const basic_string &str,
               size_type pos=0) const noexcept;

Выведем значение константы npos:

std::cout << std::string::npos << std::endl;
// 18446744073709551615
std::cout << (int)std::string::npos << std::endl;
// -1

Первый прототип ищет в строке символ ch, начиная с индекса pos. Второй прототип позволяет произвести поиск C-строки целиком, начиная с индекса pos, а третий прототип — только count первых символов C-строки. Четвертый прототип ищет объект класса basic_string, начиная с индекса pos. Если индекс pos не задан, то предполагается, что его значение равно 0. Пример:

std::string str("123454321"), str2("2");
std::cout << str.find('2') << std::endl;          // 1
std::cout << (int)str.find('6') << std::endl;     // -1
std::cout << str.find('2', 3) << std::endl;       // 7
std::cout << str.find("2") << std::endl;          // 1
std::cout << (int)str.find("6") << std::endl;     // -1
std::cout << str.find("2", 3) << std::endl;       // 7
std::cout << str.find("200", 3, 1) << std::endl;  // 7
std::cout << str.find(str2) << std::endl;         // 1
std::cout << str.find(str2, 3) << std::endl;      // 7
  • rfind() — производит поиск символа или фрагмента с конца строки. Возвращает индекс первого с конца совпадения, если фрагмент найден, или значение константы npos — в противном случае. Поиск зависит от регистра символов. Прототипы метода:
size_type rfind(_CharT ch, size_type pos=npos) const noexcept;
size_type rfind(const _CharT *str,
                size_type pos=npos) const;
size_type rfind(const _CharT *str, size_type pos,
                size_type count) const noexcept;
size_type rfind(const basic_string &str,
                size_type pos=npos) const noexcept;

Первый прототип ищет в строке символ ch, начиная с индекса pos. Второй прототип позволяет произвести поиск C-строки целиком, начиная с индекса pos, а третий прототип — только count первых символов C-строки. Четвертый прототип ищет объект класса basic_string, начиная с индекса pos. Поиск производится от индекса pos к началу строки. Если индекс pos не задан, то предполагается, что его значение равно индексу последнего элемента. Пример:

std::string str("123454321"), str2("2");
std::cout << str.rfind('2') << std::endl;         // 7
std::cout << (int)str.rfind('6') << std::endl;    // -1
std::cout << str.rfind('2', 3) << std::endl;      // 1
std::cout << str.rfind("2") << std::endl;         // 7
std::cout << (int)str.rfind("6") << std::endl;    // -1
std::cout << str.rfind("2", 3) << std::endl;      // 1
std::cout << str.rfind("200", 3, 1) << std::endl; // 1
std::cout << str.rfind(str2) << std::endl;        // 7
std::cout << str.rfind(str2, 3) << std::endl;     // 1
  • find_first_of() — производит поиск символа или какого-либо символа, входящего в указанную строку. Поиск производится с начала строки. Метод возвращает индекс первого совпадения, если символ найден, или значение константы npos — в противном случае. Поиск зависит от регистра символов. Прототипы метода:
size_type find_first_of(_CharT ch,
                        size_type pos=0) const noexcept;
size_type find_first_of(const _CharT *str,
                        size_type pos=0) const noexcept;
size_type find_first_of(const _CharT *str, size_type pos,
                        size_type count) const noexcept;
size_type find_first_of(const basic_string &str,
                        size_type pos=0) const noexcept;

Первый прототип ищет в строке символ ch, начиная с индекса pos. Второй прототип позволяет найти совпадение с каким-либо символом из C-строки, начиная с индекса pos, а третий прототип — учитывает только count первых символов C-строки. Четвертый прототип ищет совпадение с каким-либо символом из объекта класса basic_string, начиная с индекса pos. Если индекс pos не задан, то предполагается, что его значение равно 0. Пример:

std::string str("123454321"), str2("862");
std::cout << str.find_first_of('2') << std::endl;        // 1
std::cout << (int)str.find_first_of('6') << std::endl;   // -1
std::cout << str.find_first_of('2', 3) << std::endl;     // 7
std::cout << str.find_first_of("862") << std::endl;      // 1
std::cout << str.find_first_of("862", 3) << std::endl;   // 7
std::cout << str.find_first_of("250", 3, 2) << std::endl; // 4
std::cout << str.find_first_of(str2) << std::endl;       // 1
std::cout << str.find_first_of(str2, 3) << std::endl;    // 7
  • find_first_not_of() — возвращает индекс первого символа, который не совпадает ни с одним из символов, входящих в указанную строку. Если ничего не найдено, то возвращается значение константы npos. Поиск зависит от регистра символов. Прототипы метода:
size_type find_first_not_of(_CharT ch,
                            size_type pos=0) const noexcept;
size_type find_first_not_of(const _CharT *str,
                            size_type pos=0) const noexcept;
size_type find_first_not_of(const _CharT *str, size_type pos,
                            size_type count) const noexcept;
size_type find_first_not_of(const basic_string &str,
                            size_type pos=0) const noexcept;

Первый прототип ищет в строке символ, который не совпадает с символом ch. Второй прототип возвращает индекс первого символа, который не совпадает ни с одним из символов, входящих в C-строку str, а третий прототип — учитывает только count первых символов C-строки str. Четвертый прототип возвращает индекс первого символа, который не совпадает ни с одним из символов, входящих в объект класса basic_string. Поиск производится начиная с индекса pos. Если индекс pos не задан, то предполагается, что его значение равно 0. Пример:

std::string str("123454321"), str2("8621");
std::cout << str.find_first_not_of('2') << std::endl;     // 0
std::cout << str.find_first_not_of('2', 3) << std::endl;  // 3
std::cout << str.find_first_not_of("8621") << std::endl;  // 2
std::cout << str.find_first_not_of("8621", 3) 
          << std::endl;                                   // 3
std::cout << str.find_first_not_of("250", 3, 2) 
          << std::endl;                                   // 3
std::cout << str.find_first_not_of(str2) << std::endl;    // 2
std::cout << str.find_first_not_of(str2, 3) << std::endl; // 3
  • find_last_of() — метод аналогичен методу find_first_of(), но поиск производится с конца строки, а не с начала. Прототипы метода:
size_type find_last_of(_CharT ch,
                       size_type pos=npos) const noexcept;
size_type find_last_of(const _CharT *str,
                       size_type pos=npos) const noexcept;
size_type find_last_of(const _CharT *str, size_type pos,
                       size_type count) const noexcept;
size_type find_last_of(const basic_string &str,
                       size_type pos=npos) const noexcept;
  • find_last_not_of() — метод аналогичен методу find_first_not_of(), но поиск производится с конца строки, а не с начала. Прототипы метода:
size_type find_last_not_of(_CharT ch,
                           size_type pos=npos) const noexcept;
size_type find_last_not_of(const _CharT *str,
                           size_type pos=npos) const noexcept;
size_type find_last_not_of(const _CharT *str, size_type pos,
                           size_type count) const noexcept;
size_type find_last_not_of(const basic_string &str,
                           size_type pos=npos) const noexcept;

В качестве примера проверим состоит ли строка только из цифр или содержит также буквы:

std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str("5487");
std::string::size_type index = 0;
index = str.find_last_not_of("0123456789");
if (index == std::string::npos) {
   std::cout << "Строка содержит только цифры" << std::endl;
}
else std::cout << "Нет" << std::endl;

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов