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

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

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

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

02.08.2014, 00:51. Просмотров 2877. Ответов 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
Artmem
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 00:52  [ТС] #2
Есть строка string, нужно разбить её на лексемы. У меня не получается использовать strtok с типом string. Пожалуйста, делайте пояснения в коде.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2014, 01:10 #3
Цитата Сообщение от Artmem Посмотреть сообщение
Пожалуйста, делайте пояснения в коде.
Пример строки, и что из неё нужно добыть.
0
Artmem
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 01:14  [ТС] #4
Пусть строка будет такая "12, 13, 15" разделители ',' и ' '. Вывести каждое число в отдельной строке, используя strtok.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2014, 01:18 #5
Цитата Сообщение от Artmem Посмотреть сообщение
используя strtok
Если через strtok, то зачем используете string?
Цитата Сообщение от Artmem Посмотреть сообщение
Есть строка string
Есть Си-строки. Определитесь: или string, или strtok.
0
Artmem
0 / 0 / 0
Регистрация: 02.08.2014
Сообщений: 12
02.08.2014, 01:21  [ТС] #6
А если не использовать strtok, то как можно разделить тип string на лексемы?
0
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
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
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
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
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
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
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
02.08.2014, 01:42 #10
Закатай ее в istringstream и считывать через getline. Пример считывания:
Текстовый файл, в котором значения разделены точкой с запятой. Нужен ли regex?
На месте in у тебя будет переменная типа istringstream
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
02.08.2014, 01:54 #11
Цитата Сообщение от Hrollo Посмотреть сообщение
const_cast<char*>(str.c_str())
Это фу так делать.
0
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
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     Разделить строку типа string на лексемы
  #15

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 02:07
Привет! Вот еще темы с ответами:

Как сформировать строку типа 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. Т.е...


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

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

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