Форум программистов, компьютерный форум 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.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Artmem
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 00:52  [ТС]     Разделить строку типа string на лексемы #2
Есть строка string, нужно разбить её на лексемы. У меня не получается использовать strtok с типом string. Пожалуйста, делайте пояснения в коде.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2014, 01:10     Разделить строку типа string на лексемы #3
Цитата Сообщение от Artmem Посмотреть сообщение
Пожалуйста, делайте пояснения в коде.
Пример строки, и что из неё нужно добыть.
Artmem
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 01:14  [ТС]     Разделить строку типа string на лексемы #4
Пусть строка будет такая "12, 13, 15" разделители ',' и ' '. Вывести каждое число в отдельной строке, используя strtok.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2014, 01:18     Разделить строку типа string на лексемы #5
Цитата Сообщение от Artmem Посмотреть сообщение
используя strtok
Если через strtok, то зачем используете string?
Цитата Сообщение от Artmem Посмотреть сообщение
Есть строка string
Есть Си-строки. Определитесь: или string, или strtok.
Artmem
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 01:21  [ТС]     Разделить строку типа string на лексемы #6
А если не использовать strtok, то как можно разделить тип string на лексемы?
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
02.08.2014, 01:28     Разделить строку типа string на лексемы #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);
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
02.08.2014, 01:36     Разделить строку типа string на лексемы #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;
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
02.08.2014, 01:40     Разделить строку типа string на лексемы #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;
}
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
02.08.2014, 01:42     Разделить строку типа string на лексемы #10
Закатай ее в istringstream и считывать через getline. Пример считывания:
Текстовый файл, в котором значения разделены точкой с запятой. Нужен ли regex?
На месте in у тебя будет переменная типа istringstream
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
02.08.2014, 01:54     Разделить строку типа string на лексемы #11
Цитата Сообщение от Hrollo Посмотреть сообщение
const_cast<char*>(str.c_str())
Это фу так делать.
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
02.08.2014, 02:01     Разделить строку типа string на лексемы #12
Почему?
MrCold
02.08.2014, 02:03
  #13

Не по теме:

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

gray_fox
02.08.2014, 02:05
  #14

Не по теме:

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

MrCold
02.08.2014, 02:07
  #15

Не по теме:

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

gray_fox
02.08.2014, 02:12
  #16

Не по теме:

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

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

Не по теме:

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

Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
02.08.2014, 02:23     Разделить строку типа string на лексемы #19
Цитата Сообщение от Hrollo Посмотреть сообщение
Почему?
Потому что ты открываешь доступ к внутренностям объекта, которые не зря возвращены константными. Ты нарушаешь принцип инкапсуляции и такие действия когда-нибудь приведут к тому, что запорешь объект и выльется это в неприятности.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 02:29     Разделить строку типа string на лексемы
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
02.08.2014, 02:29     Разделить строку типа string на лексемы #20
Цитата Сообщение от Hrollo Посмотреть сообщение
Почему?
const_cast может просто "снять" const/volatile модификаторы, но он не превратит неизменяемые данные в изменяемые. Менять то, что объявлено const - неопределённое поведение. + инвариант класса может быть нарушен.
Yandex
Объявления
02.08.2014, 02:29     Разделить строку типа string на лексемы
Ответ Создать тему
Опции темы

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