Поиск подстроки

Последнее обновление: 02.03.2023
Упражнение 1

Напишите программу, которая считывает текст. Найдите и сохраните каждое уникальное слово и количество его вхождений в тексте. Выведите слова и количество их вхождений.

Решение
#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::string text;   // введенный текст
    std::cout << "Enter some text:\n";
    std::getline(std::cin, text);       // вводим текст

    const std::string separators {" ,;:.\"!?'\n"};      // разделители слов
    std::vector<std::string> words;                     // вектор для хранения слов
    std::vector<size_t> counts;                         // счетчик вхождений для каждого слова

    size_t start {text.find_first_not_of(separators)};  // начальный индекс первого слова
    // в цикле ищем все слова, пока start представляет действительный индекс
    while (start != std::string::npos)
    {
        // позиция сразу после окончания слова
        size_t end {text.find_first_of(separators, start + 1)};
        // если разделитель не найден, например, после слова больше нет символов
        if (end == std::string::npos)                            
        {
            end = text.length(); 
        }
        std::string word{ text.substr(start, end - start) };     // получаем слово

        // проверяем, есть ли слово в векторе
        bool isExists {false};                  // true - если слово уже есть в векторе
        for (unsigned i {}; i < words.size(); i++)
        {
            if (words[i] == word)   // если слово найдено
            {
                ++counts[i];        // увеличиваем счетчик слов
                isExists = true;       // указываем, что слово найдено
                break;              // выходим из цикла
            }
        }
        if (!isExists)                // если же слово не найдено
        {
            words.push_back(word);      // добавляем слово в вектор
            counts.push_back(1);        // для счетчика слова устанавливаем 1
        }
        start = text.find_first_not_of(separators, end + 1);  // находим начальный индекс следующего слова
    }
	std::cout << "\nWords" << std::endl;
    for (unsigned i {}; i < words.size(); ++i)
    {
        std::cout << words[i] << ": " << counts[i] << std::endl;
    }
}

Пример работы программы:

Enter some text: Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text

Words
Lorem: 2
Ipsum: 2
is: 1
simply: 1
dummy: 2
text: 2
of: 1
the: 2
printing: 1
and: 1
typesetting: 1
industry: 2
has: 1
been: 1
s: 1
standard: 1
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850