Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2022, 23:59   #11
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

MaxBrat, если очень хочется использовать функцию std::find, то можно это сделать, но здесь это будет очень искусственно и притянуто за уши (потому что есть функция std::search):
Код:
#include <assert.h>
#include <string.h>
#include <algorithm>

using namespace std;

// ищет первое вхождение pattern в text
// возвращает позицию найденной подстроки, или -1 если не найдено
int find_first_substring(const char* text, const char* pattern) {
  int pattern_len = strlen(pattern);
  if (pattern_len == 0) {return 0;}
  int text_len = strlen(text);
  const char* text_end = text + text_len;
  int pos = 0;
  for (;;) {
    assert(pos <= text_len);
    // используем функцию std::find
    const char* first_elem = find(text + pos, text_end, pattern[0]);
    if (first_elem == text_end) {return -1;}
    pos = first_elem - text;
    if (pos + pattern_len > text_len) {return -1;}
    if (equal(text + (pos + 1), text + (pos + pattern_len), pattern + 1)) {return pos;}
    pos++;
  }
}

// ищет последнее вхождение pattern в text
// возвращает позицию найденной подстроки, или -1 если не найдено
int find_last_substring(const char* text, const char* pattern) {
  const char* text_end = text + strlen(text);
  const char* pattern_end = pattern + strlen(pattern);
  // используем функцию std::find_end
  const char* pattern_in_text = find_end(text, text_end, pattern, pattern_end);
  if (pattern_in_text == text_end) {return -1;}
  return pattern_in_text - text;
}

int main() {
  const char* text = "Look, if you had one shot, or one opportunity";
  assert(find_first_substring(text, "one") == 17);
  assert(find_last_substring(text, "one") == 30);
  assert(find_first_substring(text, "two") == -1);
  assert(find_last_substring(text, "two") == -1);
  return 0;
}
Можно извратиться ещё сильнее, и заменить std::find на std::find_if или на std::find_first_of.
Цитата:
Сообщение от MaxBrat Посмотреть сообщение
std::find_first
Такой функции в STL нет.
Пётр Седов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подправить vba код artbotva Microsoft Office Excel 3 14.12.2016 12:28
Как подправить код? Drego JavaScript, Ajax 1 26.06.2013 17:38
Небольшой такой вопросик ... совсем небольшой .. zipo666 Помощь студентам 0 18.12.2011 12:49
c++ подправить grom333 Помощь студентам 4 27.05.2011 21:02
Подправить код werser Помощь студентам 4 14.03.2010 23:26