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

Разделить строку типа string на лексемы - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
Artmem
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 00:51     Разделить строку типа string на лексемы #1
Есть строка string, нужно разбить её на лексемы. У меня не получается использовать strtok с типом string.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
02.08.2014, 09:37     Разделить строку типа string на лексемы #21
Цитата Сообщение от Artmem Посмотреть сообщение
А если не использовать strtok, то как можно разделить тип string на лексемы?
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
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cctype>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string         T_str;
typedef std::vector<T_str>  T_strings;
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    T_str   const   S           =   "aaa, bbbb. cccc; dddd eeee     fffff";
    char    const   SPACE_SYMB  =   ' ';
 
    T_str   ss  =   S;
 
    std::replace_if
        (
            ss.begin    (),
            ss.end      (),
            ispunct,
            SPACE_SYMB
        );
 
    std::istringstream  ssin(ss);
    T_strings           tokens;
 
    std::copy
        (
            std::istream_iterator<T_str>    ( ssin ),
            std::istream_iterator<T_str>    (),
            std::back_inserter              ( tokens )
        );
 
    std::copy
        (
            tokens.begin                    (),
            tokens.end                      (),
            std::ostream_iterator<T_str>    ( std::cout, "\n" )
        );
 
    system("pause");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Artmem
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 14:32  [ТС]     Разделить строку типа string на лексемы #22
Цитата Сообщение от alsav22 Посмотреть сообщение
Определитесь: или string, или strtok.
C++
1
2
3
4
5
6
7
8
9
    char *ptr;
    const char *raz = " ,!?.";
    char st[1000000];
    gets(st);
    ptr = strtok(st, raz);
    while (ptr) {
        cout << "ptr = " << ptr << "\n\n";
        ptr = strtok(0, raz);
    }
А если использовать C'шные строки, то так будет правильно, или есть какие-то огрехи в моём коде?
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
03.08.2014, 13:57     Разделить строку типа string на лексемы #23
Mr.X, занятный у тебя стиль кодинга
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,579
Записей в блоге: 17
03.08.2014, 23:45     Разделить строку типа string на лексемы #24
Цитата Сообщение от OstapBender Посмотреть сообщение
Mr.X, занятный у тебя стиль кодинга
А что там занятного ? По-моему все стандартно, только возможно стоило typedef-фить от char сразу

C++
1
2
3
4
typedef char t_char
typedef std::basic_string<t_char> tstring;
typedef std::vector<tstring>  tstrings;
// итд ...
Решения на основе boost http://avazart.zz.mu/2014/02/splitstrings/
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
04.08.2014, 04:46     Разделить строку типа string на лексемы #25
Цитата Сообщение от Avazart Посмотреть сообщение
только возможно стоило typedef-фить от char сразу
А что, typedef-ы уже отменили? Вообще-то специалисты советуют именовать типы в контексте решаемой задачи, а не языка программирования, а также писать программу как письмо программисту, а не компьютеру. Ежели уж компьютеру писать, то дурная машина в машинных кодах, пожалуй, лучше поймет.
Неужели вы правда считаете, что запись std::vector<std::string> vs нагляднее, чем T_strings tokens? Кстати, что это за имя переменной такое, "vs"? Это вы так буквы экономите? Ну, тогда две буквы на имя - это явное расточительство, одной вполне было бы достаточно. Ну, а если серьезно, то те же специалисты советуют делать имена говорящими и самодокументируемыми. Обычно люди, именующие переменные буквами, тогда уж рядом пишут в комментарии что эти буквы означают. Хотя почему именно это нельзя им в имени написать - тайна сия велика есть.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,579
Записей в блоге: 17
04.08.2014, 12:07     Разделить строку типа string на лексемы #26
Цитата Сообщение от Mr.X Посмотреть сообщение
А что, typedef-ы уже отменили?
В том то и дело что если обобщать то уже предусмотреть "легкое" переключение от char / wchar_t, но это естественно просто мое примечание.
Цитата Сообщение от Mr.X Посмотреть сообщение
Неужели вы правда считаете, что запись std::vector<std::string> vs нагляднее
А как она может быть вообще наглядной, если пример учебно-демонстрационный и оно ничего несет по смыслу кроме того что это вектор строк потому и vs, или
Цитата Сообщение от Mr.X Посмотреть сообщение
T_strings tokens
говорит больше ?
По-моему только вам известно что означает префикс T_ в именовании.

Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, тогда две буквы на имя - это явное расточительство, одной вполне было бы достаточно.
А что объявления не достаточно длинные ? а итераторов итп...
Я не вижу смысла делать "длинные" названия в локальных местах где всего оперируют одна-две переменные и тем более если это только пример и нет смысловой нагрузки.
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
04.08.2014, 14:13     Разделить строку типа string на лексемы #27
Цитата Сообщение от Avazart Посмотреть сообщение
В том то и дело что если обобщать
В том-то и дело, что typedef-ы - это не обобщение, а конкретизация к контексту текущей задачи.
Цитата Сообщение от Avazart Посмотреть сообщение
А как она может быть вообще наглядной, если пример учебно-демонстрационный и оно ничего несет по смыслу кроме того что это вектор строк потому и vs
Ну, задача была разбить строку на лексемы, о чем моя запись T_strings tokens справедливо и указывает, что это контейнер, хранящий эти самые лексемы в виде строк.
Цитата Сообщение от Avazart Посмотреть сообщение
По-моему только вам известно что означает префикс T_ в именовании.
А этот префикс я добавляю к именам типов (о чем по моим typedef-ам догадаться совсем несложно). Тогда их уже ни с чем не спутаешь. Странно, что сообщество программистов на C++ давно уже не договорилось о чем-то подобном. Никогда сразу ни у кого не поймешь где имя типа, а где переменной.
Ну, вам-то понятно, что vs это вектор строк, но неплохо было бы и читателю программы это написать вместо бессмысленной аббревиатуры. Но это вы опять же только тип зашифровали, а по условию задачи там лексемы лежат, так почему прямо не написать об этом?
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,579
Записей в блоге: 17
04.08.2014, 14:34     Разделить строку типа string на лексемы #28
Цитата Сообщение от Mr.X Посмотреть сообщение
В том-то и дело, что typedef-ы - это не обобщение, а конкретизация к контексту текущей задачи.
Обобщение в шаблонах, к примеру вы используете конкретный тип std::string и придется весь код переправлять если потребуется переход на wchar_t с char - именно это я имел ввиду, а typedef поможет снизить число правок кода.

Цитата Сообщение от Mr.X Посмотреть сообщение
А этот префикс я добавляю к именам типов (о чем по моим typedef-ам догадаться совсем несложно). Тогда их уже ни с чем не спутаешь. Странно, что сообщество программистов на C++ давно уже не договорилось о чем-то подобном. Никогда сразу ни у кого не поймешь где имя типа, а где переменной.
Аля делфи?
Как по мне, лучше придерживаться более лаконичного стиля - писать классы с большой буквы, переменные/ф-ции с маленькой.

Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, вам-то понятно, что vs это вектор строк, но неплохо было бы и читателю программы это написать вместо бессмысленной аббревиатуры. Но это вы опять же только тип зашифровали, а по условию задачи там лексемы лежат, так почему прямо не написать об этом?
Лексемы ?
Я не давал пример конкретно под эту задачу, ссылка была на общий пример, а то что там по сути будет это уже другой вопрос.
Возможно это будут по сути строки/записи rows/records или ячейки cells это дело конкретной задачи, и вашей фантазии,
а парится с тем как именовать переменные в двух строчках кода, не вижу смысла.
orange_fox
 Аватар для orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
04.08.2014, 20:29     Разделить строку типа string на лексемы #29
А зачем здесь этот каст нужен?
Цитата Сообщение от Hrollo Посмотреть сообщение
const_cast<char*>(str.c_str())
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,579
Записей в блоге: 17
04.08.2014, 20:32     Разделить строку типа string на лексемы #30
Цитата Сообщение от orange_fox Посмотреть сообщение
А зачем здесь этот каст нужен?
http://www.cplusplus.com/reference/cstring/strtok/
http://www.cplusplus.com/reference/string/string/c_str/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2014, 21:05     Разделить строку типа string на лексемы
Еще ссылки по теме:

C++ Запись информации из вектора типа string в вектор типа double
C++ Читать строку типа string из файла, разбить ее на массив слов типа char

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

Или воспользуйтесь поиском по форуму:
orange_fox
 Аватар для orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
04.08.2014, 21:05     Разделить строку типа string на лексемы #31
Avazart, понял, чтобы убрать константность. Но безопасно ли так делать?
Yandex
Объявления
04.08.2014, 21:05     Разделить строку типа string на лексемы
Ответ Создать тему
Опции темы

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