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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2011, 07:15   #1
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию поиск символов (подсчёт вхождений подстроки в строку)

есть строка, например string (но не принципиально, можно и что-нибудь другое). как в ней найти количество одинаковых заданных подпоследовательностей? стандартные функции не подходят (find, find_first_of).
или в CString'е есть такая функция?
например есть строка
01010100011010100010101000
количество подстрок 000 встречается три раза
Kukurudza вне форума Ответить с цитированием
Старый 24.09.2011, 08:11   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

вынужден сразу предупредить - C/С++ я совсем не знаю.

но куда копать - подскажу.
подобные задачи могут быть решены разными способами.
примерно вот так:

1) в каких-то функциях библиотеках ЯП (ЯВУ) может быть функция,
непосредственно решающая Вашу задачу,
путём подсчёта вхождения подстроки в строку

2) если такой функции нет (или Вы её не нашли),
тогда смотрите перегруженные методы поиска
(find, find_of, indexOf, pos(), posEx() и т.п.)
на предмет наличия индекса, с которого начинать поиск.
Если нашли такую - тогда - бинго!
Организовываете простенький цикл,
в цикле считаете вхождения и индекс, с которого начинать
искать присваиваете найденной позиции + длина искомой подстроки.
цикл крутите пока что-то находится.

3) если нет и такой функции, тогда остаются два "топорных" способа
искать в цикле, каждый раз после нахождения наращивать счётчик
и удалять всё в строке с начала строки до найденной подстроки (включая и её).
цикл крутить, пока в строке есть подстрока (обычный indexof или как он там называется)

4) ну и второй "топорный" способ - это самый низкий уровень,
выделять из строки нужное число символов, сравнивать с искомой подстрокой.
если текущее выделение не совпало, увеличивать на один индекс, с которого берём символы из строки.
если совпало, тогда наращивате счётчик вхождений и индекс сдвигаете на длину искомой подстроки.
цикл крутить до ДлинаСтроки-длинаИскомойПодстроки
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.09.2011, 10:18   #3
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Kukurudza Посмотреть сообщение
стандартные функции не подходят (find, find_first_of).
Да ладно?
Код:
#include <iostream>
#include <string>

int main()
{
  const std::string source = "01010100011010100010101000";
  const std::string lexeme = "000";
  unsigned lexeme_count = 0;

  for (std::size_t pos = 0; pos < source.size(); pos += lexeme.size())
  {
    pos = source.find(lexeme, pos);
    if (pos != std::string::npos)
    {
      ++lexeme_count;
    }
    else
    {
      break;
    }
  }

  std::cout << "Result: " << lexeme_count << std::endl;
}
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчёт количества вхождений элемента Farrel SQL, базы данных 1 04.05.2011 11:41
Определить кол-во вхождений символа в си-строку. mohita Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 29.11.2010 04:28
Найти кол-во вхождений подстроки в строку Kuzya59 Общие вопросы Delphi 4 21.09.2009 12:46
Функция для определения числа вхождений подстроки в строку motorway Microsoft Office Excel 1 15.07.2009 23:28
Определить количество вхождений строки S1 в строку S2 Berckyt Microsoft Office Word 5 16.03.2009 00:27