Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 08.08.2011
Сообщений: 23
1

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

04.11.2013, 13:33. Показов 6937. Ответов 7
Метки нет (Все метки)

Помогите написать функцию для разбиения передаваемой строки на слова.
Например дана строка: "This is text, and it is black.".
И нужно вернуть слова:
This
is
text
and
it
is
black
Убил несколько дней на неё, но ничего не выходит.
Желательно не используя подключаемых файлов типа string.h.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2013, 13:33
Ответы с готовыми решениями:

Как разделить строку на слова?
Как разделить строку на слова? без использования функций

Разделить строку на слова
Здравствуйте, подскажите как разделить текст на слова. Текст вводит пользователь и он записывается...

Разделить строку на слова
Мне нужно по пробелу разделить строку на массив слов std::string s = "баянист поплыл на батискаф";

Разделить строку на слова.
В общем есть строка, и ее надо разбить на массив строк чтобы каждое слово было в ствоей строке. ...

7
583 / 386 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
04.11.2013, 13:35 2
Тут посмотрите Разбить строку string на подстроки
0
267 / 255 / 27
Регистрация: 27.09.2013
Сообщений: 876
Записей в блоге: 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];
вроде так
0
1 / 1 / 1
Регистрация: 08.08.2011
Сообщений: 23
04.11.2013, 14:20  [ТС] 4
Цитата Сообщение от egor2116 Посмотреть сообщение
Да, способ хороший. Но проблема в том, что мне нужно что бы это была функция. Переделать в функцию у меня не получается, проблема с указателями.
0
583 / 386 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
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;
}
0
1 / 1 / 1
Регистрация: 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(исходная строка, результат - массив слов);
0
What a waste!
1604 / 1297 / 179
Регистрация: 21.04.2012
Сообщений: 2,723
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
1
1 / 1 / 1
Регистрация: 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());.
Вроде работает.
Огромное спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2013, 21:06

Разделить строку на слова
Есть некая строка со словами: string stroka; И есть некоторая функция перегрузки: istream...

Разделить строку на слова
I. Данный указатель на строку “Ala ma kota, a kot ma ale”. Напишите программу, которая будет...

Разделить строку на слова. Regex
Приветствую. Изучаю регулярки, хочу разделить строку на отдельные части используя regex. Как это...

Разделить строку на слова, используя указатели
Помогите, пожалуйста, сделать программу. Ввести произвольное предложение с клавиатуры, слова...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.