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

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

02.08.2014, 00:51. Показов 13834. Ответов 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
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 00:52  [ТС] 2
Есть строка string, нужно разбить её на лексемы. У меня не получается использовать strtok с типом string. Пожалуйста, делайте пояснения в коде.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2014, 01:10 3
Цитата Сообщение от Artmem Посмотреть сообщение
Пожалуйста, делайте пояснения в коде.
Пример строки, и что из неё нужно добыть.
0
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 01:14  [ТС] 4
Пусть строка будет такая "12, 13, 15" разделители ',' и ' '. Вывести каждое число в отдельной строке, используя strtok.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2014, 01:18 5
Цитата Сообщение от Artmem Посмотреть сообщение
используя strtok
Если через strtok, то зачем используете string?
Цитата Сообщение от Artmem Посмотреть сообщение
Есть строка string
Есть Си-строки. Определитесь: или string, или strtok.
0
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 01:21  [ТС] 6
А если не использовать strtok, то как можно разделить тип string на лексемы?
0
36 / 36 / 27
Регистрация: 05.11.2013
Сообщений: 149
02.08.2014, 01:28 7
думаю как то так

C++
1
2
3
4
5
6
7
8
string str="12 fhgvbc 345. cnvjh";
string delim = ".,\t\n";
char *p = strtok(const_cast<char*>(str.c_str()),delim);
while(p)
{
      //обработка лексем
      p = strtok(0,delim);
}
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
02.08.2014, 01:36 8
Цитата Сообщение от Artmem Посмотреть сообщение
А если не использовать strtok, то как можно разделить тип string на лексемы?
Например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
std::vector<std::string> split(std::string const& input, std::string const& separators) {
   std::vector<std::string> result;
   
   std::string::size_type first = 0;
   std::string::size_type last  = 0;
   while ((first = input.find_first_not_of(separators, last)) != std::string::npos) {
       last = input.find_first_of(separators, first);
       
       std::string const token(input, first, last - first);
       result.push_back(token);
       
       first = last;
   }
   
   return result;
}
либо можно скопировать содержимое string в массив символов и использовать strtok c этим массивом
C++
1
2
3
4
5
6
char * array = new char[input.length() + 1];
strcpy(array, input.c_str());
 
// ...
 
delete[] array;
0
36 / 36 / 27
Регистрация: 05.11.2013
Сообщений: 149
02.08.2014, 01:40 9
хотя правильнее наверное будет так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
 
using namespace std;
 
int main()
{
    vector<string> lecsem;
    string str = "12, 13,14.15";
    string delim = "., ";
    char *p = strtok(const_cast<char*>(str.c_str()),delim.c_str());
    while(p)
    {
        lecsem.push_back(static_cast<string>(p));
        p = strtok(0,delim.c_str());
    }
    vector<string>::const_iterator it;
    for(it = lecsem.begin(); it != lecsem.end(); it++)
        cout<<*it<<endl;
    return 0;
}
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
02.08.2014, 01:42 10
Закатай ее в istringstream и считывать через getline. Пример считывания:
Текстовый файл, в котором значения разделены точкой с запятой. Нужен ли regex?
На месте in у тебя будет переменная типа istringstream
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
02.08.2014, 01:54 11
Цитата Сообщение от Hrollo Посмотреть сообщение
const_cast<char*>(str.c_str())
Это фу так делать.
0
36 / 36 / 27
Регистрация: 05.11.2013
Сообщений: 149
02.08.2014, 02:01 12
Почему?
0
MrCold
02.08.2014, 02:03
  #13

Не по теме:

gray_fox, а вернуть локальный vector , это нормально ?

0
gray_fox
02.08.2014, 02:05
  #14

Не по теме:

MrCold, в смысле? По значению же...

0
MrCold
02.08.2014, 02:07
  #15

Не по теме:

я не прикапываюсь, а спрашиваю )
ладно уже читаю stackoverflow

0
gray_fox
02.08.2014, 02:12
  #16

Не по теме:

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

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

Не по теме:

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

0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
02.08.2014, 02:23 19
Цитата Сообщение от Hrollo Посмотреть сообщение
Почему?
Потому что ты открываешь доступ к внутренностям объекта, которые не зря возвращены константными. Ты нарушаешь принцип инкапсуляции и такие действия когда-нибудь приведут к тому, что запорешь объект и выльется это в неприятности.
1
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
02.08.2014, 02:29 20
Цитата Сообщение от Hrollo Посмотреть сообщение
Почему?
const_cast может просто "снять" const/volatile модификаторы, но он не превратит неизменяемые данные в изменяемые. Менять то, что объявлено const - неопределённое поведение. + инвариант класса может быть нарушен.
1
02.08.2014, 02:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2014, 02:29
Помогаю со студенческими работами здесь

Разделить строку 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;,...


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

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