Форум программистов, компьютерный форум, киберфорум
long399
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
По возможности буду размещать интересные записи в своем блоге

Разбиение строки на вектор слов в C++

Запись от long399 размещена 10.12.2020 в 10:14
Показов 4958 Комментарии 18
Метки c++

Частенько приходится сталкиваться с задачей разбиения строки на слова. Особенно когда помогаю новичкам с заданиями в разделе C++ для начинающих.

Оставлю здесь код-заготовку, чтобы каждый раз не делать поиск по форуму.

Буду рад, если кому-то еще она поможет чем-то.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>
 
// замена в строке str всех встречающихся в строке separators символов на пробел
void replaceSeparators (std::string &str, const std::string &separators="\n,.!?-()[]{};:$%&^*'\"\\/|@#№~=+\t") {
    std::replace_if(
        str.begin(),
        str.end(),
        [&separators] (char c) { return separators.find(c) != std::string::npos; },
        ' '
    );
}
 
// разбиение строки str на слова
std::vector <std::string> explodeString (const std::string &str) {
    std::vector <std::string> result;
    std::string word;
 
    std::istringstream ss (str);
 
    while( ss >> word ) {
        result.push_back(word);
    }
 
    return result;
}
 
int main () {
    std::string str;
 
    std::cout << "Введите строку: "; // latin symbols only
    std::getline(std::cin, str);
 
    replaceSeparators(str);
 
    std::cout << "Слова:" << std::endl;
    for (auto &word : explodeString(str)) {
        std::cout << word << std::endl;
    }
 
    return 0;
}
Еще, возможно, где-то пригодится функция удаления из строки "лишних" пробелов. Функция заменяет множественные пробелы в середине строки на один пробел, а также удаляет пробелы в начале и конце строки, если они там есть.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// удаление из строки str "лишних" пробелов
void removeExtraSpaces (std::string &str) {
    std::size_t pos;
 
    while ( (pos = str.find("  ")) != std::string::npos ) {
        str = str.replace(pos, 2, " ");
    }
 
    if (str.front() == ' ') {
        str.erase(0, 1);
    }
 
    if (str.back() == ' ') {
        str.pop_back();
    }
}
Метки c++
Размещено в C++, Программирование
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 18
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Кто-то до сих пор не уяснил что "тяжелые" типы стоит передавать в ф-ции по константной ссылке а не по значению.
    Касательно строк актуален string_view
    Запись от Avazart размещена 10.12.2020 в 15:31 Avazart вне форума
  2. Старый комментарий
    Аватар для XLAT
    long399,
    данный код не производителен.

    чтобы ускорить, нужно вернуться к базовым вещам:
    1. слова разделяются пробелами и только пробелами
    2. для очистки от пунктуации выделить отдельную процедуру trim(...)

    Цитата Сообщение от Avazart
    Кто-то до сих пор не уяснил что "тяжелые" типы стоит передавать в ф-ции по константной ссылке а не по значению.
    уверен что автор с этим недоопечатался,
    плохо тока, что компилятор это пропустит
    Запись от XLAT размещена 10.12.2020 в 15:32 XLAT на форуме
  3. Старый комментарий
    Аватар для Avazart
    long399
    C++
    1
    2
    
    int found;
        found = str.find_first_of(separators);
    C++
    1
    
    std::size_t found = str.find_first_of(separators);
    C пониманием что такое знаковое и беззнаковое - тоже проблемы.
    Запись от Avazart размещена 10.12.2020 в 16:27 Avazart вне форума
  4. Старый комментарий
    Аватар для XLAT
    Цитата Сообщение от Avazart
    long399
    C пониманием что такое знаковое и беззнаковое - тоже проблемы.
    а вот здесь как раз проблем быть не должно, компилятор услужливо подскажет.
    Запись от XLAT размещена 10.12.2020 в 17:02 XLAT на форуме
  5. Старый комментарий
    Аватар для Avazart
    Ну видимо не подсказал если такой код с лишними проверками.
    Запись от Avazart размещена 10.12.2020 в 22:54 Avazart вне форума
  6. Старый комментарий
    Аватар для long399
    XLAT, Avazart, спасибо за замечания Исправил, все что понял из них.

    Не по теме:

    Прошу сильно палками не кидаться.

    Запись от long399 размещена 11.12.2020 в 07:58 long399 вне форума
  7. Старый комментарий
    Аватар для Avazart
    По константной ссылке (
    Запись от Avazart размещена 11.12.2020 в 09:33 Avazart вне форума
  8. Старый комментарий
    Аватар для Avazart
    2. для очистки от пунктуации выделить отдельную процедуру trim(...)
    Глупый совет как по мне.

    Заменять все на пробелы что бы искать потом только пробелы - это тот второй проход циклом.
    Запись от Avazart размещена 11.12.2020 в 09:41 Avazart вне форума
  9. Старый комментарий
    Аватар для long399
    Цитата Сообщение от Avazart
    По константной ссылке (
    Процедура prepareString() вызывалась в функции explodeString().
    Это мешало передаче строки по константной ссылке в explodeString().
    В главную функцию вынес вызов prepareString(), после ввода строки она теперь выполняется. Так думаю лучше будет.
    Запись от long399 размещена 11.12.2020 в 10:33 long399 вне форума
  10. Старый комментарий
    Аватар для Avazart
    Так думаю лучше будет.
    Нет.
    Запись от Avazart размещена 11.12.2020 в 11:16 Avazart вне форума
  11. Старый комментарий
    Аватар для Avazart
    Можешь тут посмотреть https://github.com/Avazart/Bic... /Algorithm
    Но это стянуто/подсмотрено с библиотеки boost-а.
    Запись от Avazart размещена 11.12.2020 в 11:18 Avazart вне форума
  12. Старый комментарий
    Цитата Сообщение от Avazart
    Можешь тут посмотреть https://github.com/Avazart/Bic... /Algorithm
    Но это стянуто/подсмотрено с библиотеки boost-а.
    В этом коде есть один критический недостаток
    Запись от nicolas2008 размещена 12.12.2020 в 03:38 nicolas2008 вне форума
  13. Старый комментарий
    Аватар для Avazart
    В этом коде есть один критический недостаток
    И какой же?
    Запись от Avazart размещена 12.12.2020 в 19:27 Avazart вне форума
  14. Старый комментарий
    Цитата Сообщение от Avazart
    И какой же?
    Он написан не автором этого блога
    Запись от nicolas2008 размещена 12.12.2020 в 19:53 nicolas2008 вне форума
  15. Старый комментарий
    Аватар для Avazart
    Я же говорю - так и я по сути не сам писал ..
    Запись от Avazart размещена 13.12.2020 в 14:06 Avazart вне форума
  16. Старый комментарий
    Цитата Сообщение от Avazart
    Я же говорю - так и я по сути не сам писал ..
    Тем более. Тут у нас выставка велосипедов, а не проверенных временем решений.
    Запись от nicolas2008 размещена 13.12.2020 в 14:25 nicolas2008 вне форума
  17. Старый комментарий
    Аватар для Avazart
    Проверенные и востребованные решения давно должны быть в стандартной библиотеке, но это почему-то не так.
    (по крайней мере касательно split() & trim() )
    Запись от Avazart размещена 13.12.2020 в 23:02 Avazart вне форума
  18. Старый комментарий
    Они и есть.
    Запись от nicolas2008 размещена 13.12.2020 в 23:13 nicolas2008 вне форума
 
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru