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

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

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

Помогите написать функцию для разбиения передаваемой строки на слова.
Например дана строка: "This is text, and it is black.".
И нужно вернуть слова:
This
is
text
and
it
is
black
Убил несколько дней на неё, но ничего не выходит.
Желательно не используя подключаемых файлов типа string.h.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2013, 13:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как разделить строку на слова? (C++):

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

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

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

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

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

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

7
egor2116
571 / 375 / 215
Регистрация: 20.01.2013
Сообщений: 1,135
04.11.2013, 13:35 #2
Тут посмотрите Разбить строку string на подстроки
0
Folko
265 / 253 / 27
Регистрация: 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];
вроде так
0
zombiethegame
1 / 1 / 1
Регистрация: 08.08.2011
Сообщений: 23
04.11.2013, 14:20  [ТС] #4
Цитата Сообщение от egor2116 Посмотреть сообщение
Да, способ хороший. Но проблема в том, что мне нужно что бы это была функция. Переделать в функцию у меня не получается, проблема с указателями.
0
egor2116
571 / 375 / 215
Регистрация: 20.01.2013
Сообщений: 1,135
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
zombiethegame
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
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 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
1
zombiethegame
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
04.11.2013, 21:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2013, 21:06
Привет! Вот еще темы с решениями:

Разделить строку AnsiString на слова и записать их в массив!
Доброго времени суток, что не так? char lecs; for (i=0;i&lt;1;i++) { ...

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

Разделить строку с пробелами на массив слов, затем вывести слова наоборот
Пример входных данных: 4123 awerrr rt Пример выходных данных: 3214 ...

Преобразовать строку, удалив пробелы, и разделить слова одиночной "звёздочкой"
Дана строка слов, разделенных пробелами. Между словами может быть несколько...


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

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

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