Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/741: Рейтинг темы: голосов - 741, средняя оценка - 4.59
25 / 25 / 3
Регистрация: 06.03.2010
Сообщений: 59

Аналог метода Split для std::string

29.08.2010, 17:50. Показов 151652. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как можно раздилить string?
вот например строчка из сишарп
C#
1
2
    string s = "class Klass";
    string[] sarr = s.Split(' ');
есть нечто подобное в с++ ?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.08.2010, 17:50
Ответы с готовыми решениями:

Аналог trim() для std::string
Не подскажите аналог trim() для std::string в std? Нужно убрать лишние пробелы с начала и конца строки.

Аналог дотнетовского метода Split на C++
Есть ли аналог дотнетовского метода Split на C++ или как его можно было бы наиболее просто реализовать? Например нужно строку вида...

Аналог std::string
Имеется некоторый класс, обеспечивающий работу с символами UTF-8. Назовём его uchar. Можно ли простым способом организовать класс ustring,...

11
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
29.08.2010, 17:53
Способ из гугла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
inline bool space(char c){
    return std::isspace(c);
}
 
inline bool notspace(char c){
    return !std::isspace(c);
}
 
//break a sentence into words
std::vector<std::string> split(const std::string& s){
    typedef std::string::const_iterator iter;
    std::vector<std::string> ret;
    iter i = s.begin();
    while(i!=s.end()){
        i = std::find_if(i, s.end(), notspace); // find the beginning of a word
        iter j= std::find_if(i, s.end(), space); // find the end of the same word
        if(i!=s.end()){
            ret.push_back(std::string(i, j)); //insert the word into vector
            i = j; // repeat 1,2,3 on the rest of the line.
        }
    }
    return ret;
}
2
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.08.2010, 17:53
bobromet,
C++
1
2
3
4
5
6
std::string S="class Klass";
std::vector<std::string> VecStr;
std::istringstream ss(s);
std::string String;
while(ss>>String)
   VecStr.push_back(String);
Или с использованием Boost намного легче, одной функцией вроде
1
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
29.08.2010, 17:56
Цитата Сообщение от Lavroff Посмотреть сообщение
Или с использованием Boost намного легче, одной функцией вроде
Именно, boost::split.
2
25 / 25 / 3
Регистрация: 06.03.2010
Сообщений: 59
29.08.2010, 18:09  [ТС]
Спасибо всем, буду разбиратся.
Теперь понятно почему нас учить прграмировать с шарпа начали, настолько там некоторые вещи проще.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
29.08.2010, 20:33
Как говорится, для разнообразия(способ естественно не из лучших)
C++
1
2
3
4
5
6
7
8
9
10
11
12
void split(std::vector<std::string>& dest, const std::string& str, const char* delim)
{
    char* pTempStr = strdup( str.c_str() );      
    char* pWord = strtok(pTempStr, delim);       
    while(pWord != NULL)
    {
        dest.push_back(pWord);
        pWord = strtok(NULL, delim);        
    }
    
    free(pTempStr); 
}
2
0 / 0 / 0
Регистрация: 19.04.2017
Сообщений: 1
19.04.2017, 19:46
Не профессионально, но просто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
std::vector<string> commands;
std::string line   = "Нью-Йорк Никс USA — Вашингтон Уизардз USA";      //строка, которую нужно разбить
std::string buffer = "";      //буфферная строка
for(int i=0; i < line.size(); i++){
    if(line[i] != '—'){      // "—" сплиттер
          buffer += line[i];     
    }
    else{
          commands.push_back(buffer);
          buffer = "";
    }
}
0
0 / 0 / 0
Регистрация: 14.12.2019
Сообщений: 4
07.01.2020, 00:09
Вот мой вариант, кому надо, копируйте)

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
vector<string> split(string &s, initializer_list<char> &split_by = *(new initializer_list({' ', '\n', '\t', '\r'})));
vector<string> split_lines(string& s);
 
template<class T, class E> 
bool in(T& val, E& container) {
    for (T el : container) {
        if (el == val) {
            return true;
        }
    }
    return false;
}
 
vector<string> split(string &s, initializer_list<char> &split_by) {
    vector<string> result;
    uint last_word_beg = 0;
    bool in_word = false;
    uint index = 0, len = s.length();
    uint this_length;
    for (char c : s) {
        if (in(c, split_by)) { // Word spliter detected!
            if (in_word) { // end word
                in_word = false;
                this_length = index - last_word_beg;
                string this_word;
                this_word.reserve(this_length);
                for (int i = last_word_beg; i < index; i++) {
                    this_word.push_back(s[i]);
                }
                result.push_back(this_word);
            }
            else { // Still rubbish
 
            }
        }
        else { // Non word_splitter (letter)
            if (in_word) { // In word => continue cheeling
 
            }
            else { // Letter => word beginnning
                last_word_beg = index;
                in_word = true;
            }
        }
        index++;
    }
 
    if (!in(s[len], split_by)) { // // add last word
        this_length = index - last_word_beg;
        string this_word;
        this_word.reserve(this_length);
        for (int i = last_word_beg; i < len; i++) {
            this_word.push_back(s[i]);
        }
        result.push_back(this_word);
    } 
 
    return result;
}
 
int main(){
    string s = "Hello, world!";
    vector<string> vs = split(s);
    cout << vs;
}
0
 Аватар для Recrut_rf
377 / 320 / 65
Регистрация: 14.10.2014
Сообщений: 1,369
07.01.2020, 00:42
Неужто в STL'ном стринге ничего подобного нет?

Добавлено через 4 минуты
к примеру функция substr() объекта string из STL - спомощью неё можно извлечь подстроку из строки
0
0 / 0 / 0
Регистрация: 14.12.2019
Сообщений: 4
07.01.2020, 02:21
Ну вот как бы да, нет.
А substr есть.
Есть ещё stringstream. Но он умеет разделять только п пробелу (но это не точно)
А ещё он медлнееый
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
07.01.2020, 02:23
Цитата Сообщение от don_rumata Посмотреть сообщение
Ну вот как бы да, нет.
есть <regex>
0
0 / 0 / 0
Регистрация: 14.12.2019
Сообщений: 4
07.01.2020, 12:35
Но это-то не метод у std::string. К тому же, для простого split`а это немного оверкил
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2020, 12:35
Помогаю со студенческими работами здесь

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

Реализовать аналог класса std::string с помощью vector
Помогите, пожалуйста, с кодом к заданию: Реализовать аналог класса std::string с помощью vector Заранее спасибо!

Операция std::cout для Объекта типа std::string
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор &quot;&lt;&lt;&quot;, соответствующий этим операндам&quot; ...

Запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’
private: std::string firstName; }; std::string ClientData::getFirstName() const{ return firstName; } Дает в итоге...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru