Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/68: Рейтинг темы: голосов - 68, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
1

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

02.08.2014, 00:51. Показов 13832. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть строка string, нужно разбить её на лексемы. У меня не получается использовать strtok с типом string.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2014, 00:51
Ответы с готовыми решениями:

Как скопировать строку типа std::string в другую строку такого же типа?
Хотел скопировать строку #include "stdafx.h" #include <iostream> #include <string> using...

Разбить строку на лексемы и вывести лексемы в обратном порядке.
Ребята, помогите. Получил такое задание: Напишите программу, которая вводит строку текста,...

Перевести строку типа string, в строку типа double
Помогите с кодом. Как строку типа стринг, например 123123.123123, перевести в тип double? Кода...

Как совместить строку типа String, имеющуюся в коде и функцию, принимающую std::string ?
Доброго времен суток)) У меня такая проблема: есть строка типа String^ , а функция принимает...

30
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
02.08.2014, 09:37 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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");
}
0
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 14:32  [ТС] 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'шные строки, то так будет правильно, или есть какие-то огрехи в моём коде?
0
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
03.08.2014, 13:57 23
Mr.X, занятный у тебя стиль кодинга
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.08.2014, 23:45 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/
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
04.08.2014, 04:46 25
Цитата Сообщение от Avazart Посмотреть сообщение
только возможно стоило typedef-фить от char сразу
А что, typedef-ы уже отменили? Вообще-то специалисты советуют именовать типы в контексте решаемой задачи, а не языка программирования, а также писать программу как письмо программисту, а не компьютеру. Ежели уж компьютеру писать, то дурная машина в машинных кодах, пожалуй, лучше поймет.
Неужели вы правда считаете, что запись std::vector<std::string> vs нагляднее, чем T_strings tokens? Кстати, что это за имя переменной такое, "vs"? Это вы так буквы экономите? Ну, тогда две буквы на имя - это явное расточительство, одной вполне было бы достаточно. Ну, а если серьезно, то те же специалисты советуют делать имена говорящими и самодокументируемыми. Обычно люди, именующие переменные буквами, тогда уж рядом пишут в комментарии что эти буквы означают. Хотя почему именно это нельзя им в имени написать - тайна сия велика есть.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.08.2014, 12:07 26
Цитата Сообщение от Mr.X Посмотреть сообщение
А что, typedef-ы уже отменили?
В том то и дело что если обобщать то уже предусмотреть "легкое" переключение от char / wchar_t, но это естественно просто мое примечание.
Цитата Сообщение от Mr.X Посмотреть сообщение
Неужели вы правда считаете, что запись std::vector<std::string> vs нагляднее
А как она может быть вообще наглядной, если пример учебно-демонстрационный и оно ничего несет по смыслу кроме того что это вектор строк потому и vs, или
Цитата Сообщение от Mr.X Посмотреть сообщение
T_strings tokens
говорит больше ?
По-моему только вам известно что означает префикс T_ в именовании.

Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, тогда две буквы на имя - это явное расточительство, одной вполне было бы достаточно.
А что объявления не достаточно длинные ? а итераторов итп...
Я не вижу смысла делать "длинные" названия в локальных местах где всего оперируют одна-две переменные и тем более если это только пример и нет смысловой нагрузки.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
04.08.2014, 14:13 27
Цитата Сообщение от Avazart Посмотреть сообщение
В том то и дело что если обобщать
В том-то и дело, что typedef-ы - это не обобщение, а конкретизация к контексту текущей задачи.
Цитата Сообщение от Avazart Посмотреть сообщение
А как она может быть вообще наглядной, если пример учебно-демонстрационный и оно ничего несет по смыслу кроме того что это вектор строк потому и vs
Ну, задача была разбить строку на лексемы, о чем моя запись T_strings tokens справедливо и указывает, что это контейнер, хранящий эти самые лексемы в виде строк.
Цитата Сообщение от Avazart Посмотреть сообщение
По-моему только вам известно что означает префикс T_ в именовании.
А этот префикс я добавляю к именам типов (о чем по моим typedef-ам догадаться совсем несложно). Тогда их уже ни с чем не спутаешь. Странно, что сообщество программистов на C++ давно уже не договорилось о чем-то подобном. Никогда сразу ни у кого не поймешь где имя типа, а где переменной.
Ну, вам-то понятно, что vs это вектор строк, но неплохо было бы и читателю программы это написать вместо бессмысленной аббревиатуры. Но это вы опять же только тип зашифровали, а по условию задачи там лексемы лежат, так почему прямо не написать об этом?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.08.2014, 14:34 28
Цитата Сообщение от Mr.X Посмотреть сообщение
В том-то и дело, что typedef-ы - это не обобщение, а конкретизация к контексту текущей задачи.
Обобщение в шаблонах, к примеру вы используете конкретный тип std::string и придется весь код переправлять если потребуется переход на wchar_t с char - именно это я имел ввиду, а typedef поможет снизить число правок кода.

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

Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, вам-то понятно, что vs это вектор строк, но неплохо было бы и читателю программы это написать вместо бессмысленной аббревиатуры. Но это вы опять же только тип зашифровали, а по условию задачи там лексемы лежат, так почему прямо не написать об этом?
Лексемы ?
Я не давал пример конкретно под эту задачу, ссылка была на общий пример, а то что там по сути будет это уже другой вопрос.
Возможно это будут по сути строки/записи rows/records или ячейки cells это дело конкретной задачи, и вашей фантазии,
а парится с тем как именовать переменные в двух строчках кода, не вижу смысла.
0
34 / 34 / 8
Регистрация: 06.04.2014
Сообщений: 189
04.08.2014, 20:29 29
А зачем здесь этот каст нужен?
Цитата Сообщение от Hrollo Посмотреть сообщение
const_cast<char*>(str.c_str())
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.08.2014, 20:32 30
Цитата Сообщение от orange_fox Посмотреть сообщение
А зачем здесь этот каст нужен?
http://www.cplusplus.com/reference/cstring/strtok/
http://www.cplusplus.com/refer... ing/c_str/
0
34 / 34 / 8
Регистрация: 06.04.2014
Сообщений: 189
04.08.2014, 21:05 31
Avazart, понял, чтобы убрать константность. Но безопасно ли так делать?
0
04.08.2014, 21:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2014, 21:05
Помогаю со студенческими работами здесь

Разделить строку string на подстроки
Однажды по непонятной причине все запятые в Васином списке исчезли, и все адреса «склеились». У...

Читать строку типа string из файла, разбить ее на массив слов типа char
Нужно сделать так что бы строчка вида &quot;&lt;слово1&gt;:&lt;слово2&gt;:&lt;слово3&gt;:&lt;слово4&gt;&quot; , считывалась и каждое...

Как преобразовать число типа int в строку типа string без методов-конвертов на C#?
В общем, все что выше написано. Пишу в Visual Studio на C#. Преобразовать без конвертирования,...

Из элементов массива типа integer в -> строку типа string
Вначале я перевожу из строки в массив, а затем мне необходимо сделать компиляцию обратно из массива...

Как разделить и преобразовать строку из string в int?
Требуется создать приложение для нахождения максимального числа из строки. Поиск по форумам дал...

Разделить символьный массив на лексемы
Нужно разделить символьный массив на лексемы. Новая лексема - от и до мат. знака (&quot;+&quot;, &quot;-&quot;, &quot;*&quot;,...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru