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

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

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

Студворк — интернет-сервис помощи студентам
Есть строка string, нужно разбить её на лексемы. У меня не получается использовать strtok с типом string.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.08.2014, 00:51
Ответы с готовыми решениями:

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

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

Перевести строку типа string, в строку типа double
Помогите с кодом. Как строку типа стринг, например 123123.123123, перевести в тип double? Кода перевожу с помощью "atof" оно...

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

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

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

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru