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

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

29.08.2010, 17:50. Показов 151907. Ответов 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
388 / 333 / 65
Регистрация: 14.10.2014
Сообщений: 1,438
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
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru