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

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

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

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

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

Есть строка string, нужно разбить её на лексемы. У меня не получается использовать strtok с типом string.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2014, 00:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разделить строку типа string на лексемы (C++):

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

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

Читать строку типа string из файла, разбить ее на массив слов типа char - C++
Нужно сделать так что бы строчка вида "<слово1>:<слово2>:<слово3>:<слово4>" , считывалась и каждое слово заносилось в свою переменную....

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

String разбить на лексемы - C++
есть пример которий записаний в string str1=("25+69-65*85/58+65*(12+36)+36") нужно его разбить на лексеми и записать в другой string str2 ...

Как считать строку типа string? - C++
Доброго времени суток, у меня возникла такая проблема: когда строку задаю константой - программа работает хорошо, когда хочу считать с...

30
gray_fox
02.08.2014, 02:12     Разделить строку типа string на лексемы
  #16

Не по теме:

Цитата Сообщение от MrCold Посмотреть сообщение
я не прикапываюсь, а спрашиваю )
Ок. Просто будет создана копия для клиента, локальный для функции result будет разрушен (если не учитывать возможные оптимизации).

0
MrCold
02.08.2014, 02:13
  #17
0
gray_fox
02.08.2014, 02:22
  #18

Не по теме:

MrCold, там кстати в первом ответе более точно написано (относительно современного С++): результат будет перемещён, а не скопирован.

0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
02.08.2014, 02:23 #19
Цитата Сообщение от Hrollo Посмотреть сообщение
Почему?
Потому что ты открываешь доступ к внутренностям объекта, которые не зря возвращены константными. Ты нарушаешь принцип инкапсуляции и такие действия когда-нибудь приведут к тому, что запорешь объект и выльется это в неприятности.
1
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
02.08.2014, 02:29 #20
Цитата Сообщение от Hrollo Посмотреть сообщение
Почему?
const_cast может просто "снять" const/volatile модификаторы, но он не превратит неизменяемые данные в изменяемые. Менять то, что объявлено const - неопределённое поведение. + инвариант класса может быть нарушен.
1
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
02.08.2014, 09:37 #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");
}
0
Artmem
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
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
03.08.2014, 13:57 #23
Mr.X, занятный у тебя стиль кодинга
0
Avazart
Эксперт С++
7246 / 5418 / 297
Регистрация: 10.12.2010
Сообщений: 24,042
Записей в блоге: 17
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
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 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
Avazart
Эксперт С++
7246 / 5418 / 297
Регистрация: 10.12.2010
Сообщений: 24,042
Записей в блоге: 17
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
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
04.08.2014, 14:13 #27
Цитата Сообщение от Avazart Посмотреть сообщение
В том то и дело что если обобщать
В том-то и дело, что typedef-ы - это не обобщение, а конкретизация к контексту текущей задачи.
Цитата Сообщение от Avazart Посмотреть сообщение
А как она может быть вообще наглядной, если пример учебно-демонстрационный и оно ничего несет по смыслу кроме того что это вектор строк потому и vs
Ну, задача была разбить строку на лексемы, о чем моя запись T_strings tokens справедливо и указывает, что это контейнер, хранящий эти самые лексемы в виде строк.
Цитата Сообщение от Avazart Посмотреть сообщение
По-моему только вам известно что означает префикс T_ в именовании.
А этот префикс я добавляю к именам типов (о чем по моим typedef-ам догадаться совсем несложно). Тогда их уже ни с чем не спутаешь. Странно, что сообщество программистов на C++ давно уже не договорилось о чем-то подобном. Никогда сразу ни у кого не поймешь где имя типа, а где переменной.
Ну, вам-то понятно, что vs это вектор строк, но неплохо было бы и читателю программы это написать вместо бессмысленной аббревиатуры. Но это вы опять же только тип зашифровали, а по условию задачи там лексемы лежат, так почему прямо не написать об этом?
0
Avazart
Эксперт С++
7246 / 5418 / 297
Регистрация: 10.12.2010
Сообщений: 24,042
Записей в блоге: 17
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
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
04.08.2014, 20:29 #29
А зачем здесь этот каст нужен?
Цитата Сообщение от Hrollo Посмотреть сообщение
const_cast<char*>(str.c_str())
0
Avazart
Эксперт С++
7246 / 5418 / 297
Регистрация: 10.12.2010
Сообщений: 24,042
Записей в блоге: 17
04.08.2014, 20:32 #30
Цитата Сообщение от orange_fox Посмотреть сообщение
А зачем здесь этот каст нужен?
http://www.cplusplus.com/reference/cstring/strtok/
http://www.cplusplus.com/reference/string/string/c_str/
0
04.08.2014, 20:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2014, 20:32
Привет! Вот еще темы с ответами:

Как сформировать строку типа string - C++
#include &lt;iostream&gt; #include &lt;string&gt; int main() { string s; s = 'a'; s = 'b'; s = '\0'; std::cout...

Можно ли строку (типа string) отсортировать с помощью qsort? - C++
Как можно строку a (типа string) отсортировать с помощью qsort, или это не возможно? На это ... int compare (const void * a, const...

Обработать строку типа string, заменив одинаковые символы символом и их количеством - C++
Вводится строка, например AABVHHCSDDK. Если есть одинаковые последующие символы(в нашем примере это AA, HH, DD), то на экран выводится...

Избыточный перенос на новую строку при отображении значения типа string - C++
Когда ввожу проиpвольное значение в терминал, к примеру: asdsad dfadf. То программа выдает ответ: Output: asdsad dfadf. Т.е...


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

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

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