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

Как разделить строку на слова? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
zombiethegame
 Аватар для zombiethegame
1 / 1 / 0
Регистрация: 08.08.2011
Сообщений: 23
04.11.2013, 13:33     Как разделить строку на слова? #1
Помогите написать функцию для разбиения передаваемой строки на слова.
Например дана строка: "This is text, and it is black.".
И нужно вернуть слова:
This
is
text
and
it
is
black
Убил несколько дней на неё, но ничего не выходит.
Желательно не используя подключаемых файлов типа string.h.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
04.11.2013, 13:35     Как разделить строку на слова? #2
Тут посмотрите Разбить строку string на подстроки
Folko
 Аватар для Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
04.11.2013, 13:35     Как разделить строку на слова? #3
zombiethegame, типа так...
C++
1
2
3
for (int i = 0; i < n; i++)
if (a[i] == ' ') cout << endl;
else cout << a[i];
вроде так
zombiethegame
 Аватар для zombiethegame
1 / 1 / 0
Регистрация: 08.08.2011
Сообщений: 23
04.11.2013, 14:20  [ТС]     Как разделить строку на слова? #4
Цитата Сообщение от egor2116 Посмотреть сообщение
Да, способ хороший. Но проблема в том, что мне нужно что бы это была функция. Переделать в функцию у меня не получается, проблема с указателями.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
04.11.2013, 15:25     Как разделить строку на слова? #5
мне нужно что бы это была функция.
Как то так ?

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
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
 
std::vector< std::string > _trun(std::string & str )
{
    std::stringstream stream(str);
    std::string word;    
    std::vector<std::string> vec;
    while (stream >> word)
            vec.push_back(word);       
            return vec;
}
 
int main()
{
    
    std::string str = "one two three four five six seven eight nine ten";
    std::vector< std::string > vec_res(_trun(str));
    std::copy(vec_res.begin(), vec_res.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
 
    system("PAUSE");
    return 0;
}
zombiethegame
 Аватар для zombiethegame
1 / 1 / 0
Регистрация: 08.08.2011
Сообщений: 23
04.11.2013, 15:51  [ТС]     Как разделить строку на слова? #6
Цитата Сообщение от egor2116 Посмотреть сообщение
Как то так ?

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
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
 
std::vector< std::string > _trun(std::string & str )
{
    std::stringstream stream(str);
    std::string word;    
    std::vector<std::string> vec;
    while (stream >> word)
            vec.push_back(word);       
            return vec;
}
 
int main()
{
    
    std::string str = "one two three four five six seven eight nine ten";
    std::vector< std::string > vec_res(_trun(str));
    std::copy(vec_res.begin(), vec_res.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
 
    system("PAUSE");
    return 0;
}
Ну.... Почти. Вообще нельзя использовать класс vector и string.
А вид функции должен быть примерно таков:
void CutString(исходная строка, результат - массив слов);
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
04.11.2013, 19:43     Как разделить строку на слова? #7
а может...
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <cassert>
 
 
struct c_str_ref {
 
   c_str_ref() : first(), last() {}
 
   c_str_ref(char const* const first, char const* const last) : first(first), last(last) {}
   
   char const* begin() const {
      return first;
   }
   
   char const* end() const {
      return last;
   }
   
   bool empty() const {
      return begin() == end();
   }
   
   std::size_t size() const  {
      return end() - begin();
   }
 
 
private:
   char const* first;
   char const* last;
};
 
std::ostream & operator <<(std::ostream & ostream, c_str_ref const ref) {
   ostream.write(ref.begin(), ref.size());
   return ostream;
}
 
 
char const* c_str_find(char const* str, char const what) {
   assert(str); 
 
   for ( ; *str; ++str) {
      if (*str == what) {
         return str;
      }
   }
   
   return 0;
}
 
 
struct splitted {
 
   splitted(char const* const str, char const* const separators)
        : str(str), separators(separators), curr() {
      assert(str);
      assert(separators);
      next();
   }
   
   bool has_next() {
      return !curr.empty();
   }
   
   c_str_ref current() const {
      return curr;
   }
   
   void next() {
      char const* const first = first_nonseparator_or_end();
         
      if (*str) {
         ++str;
      }
      
      curr = {first, first_separator_or_end()};
   }
   
   
private:
   char const* first_separator_or_end() {
      for ( ; *str; ++str) {
         if (c_str_find(separators, *str)) {
            return str;
         }
      }
      
      return str;
   }
   
   char const* first_nonseparator_or_end() {
      for ( ; *str; ++str) {
         if (!c_str_find(separators, *str)) {
            return str;
         }
      }
      
      return str;
   }
 
 
   char const* str;
   char const* const separators;
   c_str_ref curr;
};
 
 
int main() {
   char const* const str = "This is text, and it is black.";
    
   for (splitted word(str, "., "); word.has_next(); word.next()) {
      std::cout << word.current() << std::endl;
   }
}
http://ideone.com/JOEKs5
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2013, 21:06     Как разделить строку на слова?
Еще ссылки по теме:

C++ Разделить строку на слова
Как разделить строку на слова? C++
Как лучше всего разделить строку на несколько подстрок? C++

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

Или воспользуйтесь поиском по форуму:
zombiethegame
 Аватар для zombiethegame
1 / 1 / 0
Регистрация: 08.08.2011
Сообщений: 23
04.11.2013, 21:06  [ТС]     Как разделить строку на слова? #8
Цитата Сообщение от gray_fox Посмотреть сообщение
а может...
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <cassert>
 
 
struct c_str_ref {
 
   c_str_ref() : first(), last() {}
 
   c_str_ref(char const* const first, char const* const last) : first(first), last(last) {}
   
   char const* begin() const {
      return first;
   }
   
   char const* end() const {
      return last;
   }
   
   bool empty() const {
      return begin() == end();
   }
   
   std::size_t size() const  {
      return end() - begin();
   }
 
 
private:
   char const* first;
   char const* last;
};
 
std::ostream & operator <<(std::ostream & ostream, c_str_ref const ref) {
   ostream.write(ref.begin(), ref.size());
   return ostream;
}
 
 
char const* c_str_find(char const* str, char const what) {
   assert(str); 
 
   for ( ; *str; ++str) {
      if (*str == what) {
         return str;
      }
   }
   
   return 0;
}
 
 
struct splitted {
 
   splitted(char const* const str, char const* const separators)
        : str(str), separators(separators), curr() {
      assert(str);
      assert(separators);
      next();
   }
   
   bool has_next() {
      return !curr.empty();
   }
   
   c_str_ref current() const {
      return curr;
   }
   
   void next() {
      char const* const first = first_nonseparator_or_end();
         
      if (*str) {
         ++str;
      }
      
      curr = {first, first_separator_or_end()};
   }
   
   
private:
   char const* first_separator_or_end() {
      for ( ; *str; ++str) {
         if (c_str_find(separators, *str)) {
            return str;
         }
      }
      
      return str;
   }
   
   char const* first_nonseparator_or_end() {
      for ( ; *str; ++str) {
         if (!c_str_find(separators, *str)) {
            return str;
         }
      }
      
      return str;
   }
 
 
   char const* str;
   char const* const separators;
   c_str_ref curr;
};
 
 
int main() {
   char const* const str = "This is text, and it is black.";
    
   for (splitted word(str, "., "); word.has_next(); word.next()) {
      std::cout << word.current() << std::endl;
   }
}
http://ideone.com/JOEKs5
Да! То что нужно. Немного сложновато для понимания, но работает и пусть работает.
curr = {first, first_separator_or_end()}; - эта строчка не работала, заменил на:
curr = c_str_ref(first, first_separator_or_end());.
Вроде работает.
Огромное спасибо!
Yandex
Объявления
04.11.2013, 21:06     Как разделить строку на слова?
Ответ Создать тему
Опции темы

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