C++

Получить слово из текста C++: stringstream, позиция слова и поиск

Чтобы получить слово из текста в C++, удобнее всего использовать std::istringstream из заголовка <sstream>. Он позволяет воспринимать строку как поток ввода и читать из нее слова оператором >>

Минимальный пример:

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string text = "hello world from cpp";
    std::istringstream stream(text);

    std::string word;
    stream >> word;

    std::cout << word << "\n";
    return 0;
}

Вывод:

hello

Оператор >> читает до пробела, табуляции или перевода строки. Поэтому он хорошо подходит для простого разбиения текста на слова

Получить все слова

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string text = "hello world from cpp";
    std::istringstream stream(text);

    std::string word;

    while (stream >> word) {
        std::cout << word << "\n";
    }

    return 0;
}

Результат:

hello
world
from
cpp

Цикл работает, пока из потока удается прочитать очередное слово

Получить слово по номеру

Если нужно получить, например, третье слово:

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string text = "one two three four";
    std::istringstream stream(text);

    std::string word;
    int target = 3;
    int index = 0;

    while (stream >> word) {
        ++index;

        if (index == target) {
            std::cout << word << "\n";
            return 0;
        }
    }

    std::cout << "Такого слова нет\n";
    return 0;
}

Вывод:

three

В этом примере нумерация слов начинается с 1, потому что так обычно формулируют пользовательскую задачу

Сохранить слова в vector

Если слова нужны дальше:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

int main() {
    std::string text = "red green blue";
    std::istringstream stream(text);
    std::vector<std::string> words;

    std::string word;

    while (stream >> word) {
        words.push_back(word);
    }

    std::cout << words[1] << "\n";
    return 0;
}

Вывод:

green

Перед обращением по индексу в реальной программе проверяйте размер words

Найти конкретное слово в тексте

Если нужно проверить, есть ли слово:

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string text = "cat dog bird";
    std::istringstream stream(text);

    std::string word;
    std::string target = "dog";

    while (stream >> word) {
        if (word == target) {
            std::cout << "Слово найдено\n";
            return 0;
        }
    }

    std::cout << "Слово не найдено\n";
    return 0;
}

Такой способ лучше простого find, если нужно искать именно отдельное слово, а не подстроку внутри другого слова

Что делать со знаками препинания

Если текст такой:

hello, world!

то stringstream прочитает слова как:

hello,
world!

Запятая и восклицательный знак останутся частью строк. Если нужно чистое слово, знаки препинания надо удалять отдельно

Простой вариант для английских слов:

word.erase(std::remove_if(word.begin(), word.end(), ::ispunct), word.end());

Для этого понадобятся <algorithm> и <cctype>. С Unicode и русской пунктуацией задача сложнее, потому что один видимый символ может занимать несколько байтов

Частые ошибки

Использовать getline для слова

std::getline читает строку целиком. Для слов удобнее >> из istringstream

Искать через find без учета границ

text.find("cat") найдет cat и в слове catalog. Если нужно именно слово, разбирайте текст на слова

Не проверять, что слово существует

Если пользователь просит десятое слово, а в тексте только три, программа должна вывести понятное сообщение

Короткий вывод

Чтобы получить слово из текста в C++, используйте std::istringstream и оператор >>. Для слова по номеру считайте позиции в цикле. Для поиска отдельного слова лучше разбирать текст на слова, а не искать подстроку через find

Связанные материалы:

Что почитать дальше по C++

Если нужен общий маршрут по теме, откройте рубрику C++. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x