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

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

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

Author24 — интернет-сервис помощи студентам
Как можно раздилить string?
вот например строчка из сишарп
C#
1
2
    string s = "class Klass";
    string[] sarr = s.Split(' ');
есть нечто подобное в с++ ?
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2010, 17:50
Ответы с готовыми решениями:

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

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

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

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

11
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
29.08.2010, 17:53 2
Способ из гугла
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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.08.2010, 17:53 3
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
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
29.08.2010, 17:56 4
Цитата Сообщение от Lavroff Посмотреть сообщение
Или с использованием Boost намного легче, одной функцией вроде
Именно, boost::split.
2
25 / 25 / 3
Регистрация: 06.03.2010
Сообщений: 59
29.08.2010, 18:09  [ТС] 5
Спасибо всем, буду разбиратся.
Теперь понятно почему нас учить прграмировать с шарпа начали, настолько там некоторые вещи проще.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
29.08.2010, 20:33 6
Как говорится, для разнообразия(способ естественно не из лучших)
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 7
Не профессионально, но просто:
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 8
Вот мой вариант, кому надо, копируйте)

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
369 / 310 / 65
Регистрация: 14.10.2014
Сообщений: 1,318
07.01.2020, 00:42 9
Неужто в STL'ном стринге ничего подобного нет?

Добавлено через 4 минуты
к примеру функция substr() объекта string из STL - спомощью неё можно извлечь подстроку из строки
0
0 / 0 / 0
Регистрация: 14.12.2019
Сообщений: 4
07.01.2020, 02:21 10
Ну вот как бы да, нет.
А substr есть.
Есть ещё stringstream. Но он умеет разделять только п пробелу (но это не точно)
А ещё он медлнееый
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
07.01.2020, 02:23 11
Цитата Сообщение от don_rumata Посмотреть сообщение
Ну вот как бы да, нет.
есть <regex>
0
0 / 0 / 0
Регистрация: 14.12.2019
Сообщений: 4
07.01.2020, 12:35 12
Но это-то не метод у std::string. К тому же, для простого split`а это немного оверкил
0
07.01.2020, 12:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2020, 12:35
Помогаю со студенческими работами здесь

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

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

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

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

Алгоритм std::find_end - аналог std::search_n
Есть два семейства стандартных алгоритмов: std::search и std::find_end. Первое семейство...

Реализация класса MyString. Стандартная библиотека, std::string, std::vector
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru