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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
zombiethegame
1 / 1 / 0
Регистрация: 08.08.2011
Сообщений: 23
#1

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

04.11.2013, 13:33. Просмотров 1909. Ответов 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++):

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

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

Разделить строку на слова. - C++
В общем есть строка, и ее надо разбить на массив строк чтобы каждое слово было в ствоей строке. Знаю что надо пользоваться strstr но в...

Разделить строку на слова - C++
Есть некая строка со словами: string stroka; И есть некоторая функция перегрузки: istream & operator >>(istream * os) { ...

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

Разделить строку AnsiString на слова и записать их в массив! - C++
Доброго времени суток, что не так? char lecs; for (i=0;i<1;i++) { String str = A.NameBook; char *pch; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
04.11.2013, 13:35 #2
Тут посмотрите Разбить строку string на подстроки
0
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];
вроде так
0
zombiethegame
1 / 1 / 0
Регистрация: 08.08.2011
Сообщений: 23
04.11.2013, 14:20  [ТС] #4
Цитата Сообщение от egor2116 Посмотреть сообщение
Да, способ хороший. Но проблема в том, что мне нужно что бы это была функция. Переделать в функцию у меня не получается, проблема с указателями.
0
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
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 / 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(исходная строка, результат - массив слов);
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 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 / 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());.
Вроде работает.
Огромное спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2013, 21:06
Привет! Вот еще темы с ответами:

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

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

Разделить строку на слова, вывести в столбик, подсчитать количество слов с буквой "а" - C++
Здравствуйте! Я новичок в этом деле. застопорился на строках Прошу помощи у вас Мне надо решить пару задач : 1. Дана строка, мне...

Как разделить предложение на слова в c++ - C++
У меня есть предложение и мне нужно каждое слово поместить как отельный элемент вектора или массива . Помогите реализовать!!


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.11.2013, 21:06
Ответ Создать тему
Опции темы

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