Форум программистов, компьютерный форум CyberForum.ru

string split - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
VladislavTepes
 Аватар для VladislavTepes
78 / 78 / 5
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
31.03.2013, 16:29     string split #1
Здравствуйте. Подскажите, есть ли способ разделить строку по пробелам и записать полученные части в массив (по сути, аналог Split() в c#)?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
31.03.2013, 16:37     string split #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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <string>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
 
std::vector<std::string> split(const std::string& s, const char * delim)
{
    std::string::size_type size = s.length();
    char * const buffer = new char[size + 1];
    std::vector<std::string> res;
    
    strcpy(buffer, s.c_str());
    
    char * p = strtok(buffer, delim);
    while (p)
    {
        res.push_back(std::string(p));
        p = strtok(NULL, delim);
    }
    delete[]buffer;
    
    return res;
}
 
int main()
{
    std::string s("vf b fgb gf b f b");
    
    std::cout << "Source string: " << std::endl << s << std::endl;
    
    std::vector<std::string> r = split(s, " ");
    
    std::cout << "Splitted terms: " << std::endl;
    for (std::vector<std::string>::const_iterator i = r.begin(), end = r.end(); i != end; ++i)
        std::cout << *i << std::endl;
    
    return EXIT_SUCCESS;
}
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
31.03.2013, 16:39     string split #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string.hpp>
 
int main() 
{
    setlocale (0, "Russian");
    
    std::vector<std::string> words;
    std::string str = "Подскажите, есть ли способ разделить строку по пробелам";
    boost::split(words, str, boost::algorithm::is_space(), boost::token_compress_on);
    for (auto& i : words) std::cout<<i<<"\n";
    
    return 0;
}
VladislavTepes
 Аватар для VladislavTepes
78 / 78 / 5
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
31.03.2013, 16:40  [ТС]     string split #4
sandye51, хорошо, но как мне теперь получить какую-либо часть оттуда?

Добавлено через 43 секунды
yuron_477, я так понимаю, с использованием boost? Ее еще подключить надо?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
31.03.2013, 16:42     string split #5
anonymous2797, почитайте что такое std::vector и такие вопросы отпадут
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
31.03.2013, 16:52     string split #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::vector<std::string> split(const std::string &string,
                               const std::string &delims)
{
   std::vector<std::string> result;
   size_t current_idx = 0;
   while (current_idx != std::string::npos) {
      size_t from = string.find_first_not_of(delims, current_idx);
      size_t to   = string.find_first_of(delims, from);
      size_t len  = std::string::npos;
      if (to != std::string::npos) {
         len = to - from;
      }
      result.push_back(string.substr(from, len));
      current_idx = to;
   }
   return result;
}
Для бедных. (Лажает на пустой строке, да.)
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
31.03.2013, 17:03     string split #7
Еще так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
 
int main() 
{
    setlocale (0, "Russian");
    
    std::string str = "Подскажите, есть ли способ    разделить    строку по пробелам";
    std::istringstream iss(str);
    std::vector<std::string> words {std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>()};
    for (auto& i : words) std::cout<<i<<"\n";
 
    return 0;
}
IrineK
Заблокирован
31.03.2013, 17:04     string split #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
#include <iostream>
#include <sstream>
using namespace std;
 
int main()
{   string s, cur;
    int i= 0, num = 0;
    cout<<"Your string:\n";
    getline(cin, s);
    istringstream ist(s);
    
    while(ist>>cur) //находим кво слов
        num++;
    string *word = new string[num];//создаем массив
    
    ist.clear();
    ist.seekg (0, ist.beg);
    while(ist>>cur)     //записываем
        word[i++] = cur;
 
    //проверяем
    cout<<"Your words:\n";
    for(int i=0;i<num;i++)
        cout<<'\t'<<word[i]<<'\n';
 
    delete [] word;
    cin.sync(); cin.get();
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2013, 19:22     string split
Еще ссылки по теме:

аналог input().split() C++ C++
C++ Идентификатор string не определён при наличии #include <string>
C++ Какое одинаковое значение можно вернуть из функций <string> f () и vector < <string> > f()?

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

Или воспользуйтесь поиском по форуму:
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
31.03.2013, 19:22     string split #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::vector<std::string> split(const std::string& src, const std::string& delim)
{
    std::vector<std::string> dest;
    std::string::size_type i = src.find_first_not_of(delim);
    while(i != std::string::npos)
    {
        const std::string::size_type j = src.find_first_of(delim, i);
        if(j == std::string::npos)
        {
            dest.push_back(src.substr(i));
            return dest;
        }
 
        const std::string::size_type n = j - i;
        dest.push_back(src.substr(i, n));
        i = src.find_first_not_of(delim, i + n);
    }
 
    return dest;
}
Yandex
Объявления
31.03.2013, 19:22     string split
Ответ Создать тему
Опции темы

Текущее время: 15:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru