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++. Для соседних задач пригодятся эти разборы:
- Как получить слово из файла в C++: первое слово, все слова и проверка ошибок
- Как разбить слово на цифры и буквы в C++
- Как убрать выделение текста в C++: строка, консоль и графический интерфейс
- C++ с нуля: первый файл, переменные и вывод