Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Fobes
16 / 16 / 5
Регистрация: 19.09.2012
Сообщений: 212
#1

Быстрый парсинг строки - C++

24.11.2015, 13:02. Просмотров 710. Ответов 4
Метки нет (Все метки)

Всем доброго времени суток... Прошу разъяснить что делаю не так.
Получаю строку вида, нужно ее обработать с минимальными задержками, по этому посмотрел в сторону strtok:
"B 1023 0 0 0 0 0 0 0 E
74 E

"

Нужно ее обработать. Важна только первая строчка, все остальное - мусор, который меняется. Пытаюсь сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//бежим до первого перехода на новую строку
char* tmp = strtok(buf, "\r"); 
//выводим, получили то что нужно "B 1023 0 0 0 0 0 0 0 E"
std::cout << tmp;
 
//парсим tmp
char* tmp1 = strtok(tmp, " ");  
while (tmp1 != NULL)
{
std::cout << tmp1;
tmp1 = strtok(NULL, " ");
}  
 
std::cout << std::endl;
Запускаю, получаю странную картину, обрабатывает 2 раза правильно, потом ерунда:
Кликните здесь для просмотра всего текста

B 1023 0 0 0 0 0 0 0 EB10230000000E
B 1023 0 0 0 0 0 0 0 EB10230000000E
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
B 1023 0 0 0 0 0 0 0 EB10230000000E
B 1023 0 0 0 0 0 0 0 EB10230000000E
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB

Что я делаю не так ? Ведь если убрать обработку tmp, то будет выводить все правильно, только первую строку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2015, 13:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Быстрый парсинг строки (C++):

Парсинг строки
Доброе время суток! столкнулся с такой проблемой что странно отрекаются...

Парсинг строки
Добрый день,подскажите, почему и как исправить у меня commands.c_str() -...

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

парсинг строки
Добрый день. Стоит задача - &quot;найти производную многочлена. Многочлен может быть...

Парсинг строки
Добрый день. Помогите с решением следующей задачи. На вход идет строка из 0 и...

Парсинг чисел из строки
Подскажите пожалуйста функцию, которая моглабы парсить из строки. Ну что-то на...

4
Renji
2141 / 1500 / 456
Регистрация: 05.06.2014
Сообщений: 4,338
24.11.2015, 15:18 #2
Во второй строчке strtok возвращает указатель на свой внутренний буфер. В седьмой строчке вы просите strtok распарсить этот буфер, а результаты он кладет... Правильно, в тот самый буфер, который и парсит. В итоге получается какая-то фигня. Надо как-то так:
C++
1
2
3
4
5
6
const char buf[]="B 1023 0 0 0 0 0 0 0 E";
const char*end=buf;
for(;*end && *end!='\n';++end);
for(const char*pos=buf;pos<end;++pos)
    if(*pos!=' ')
        cout<<*pos;
0
Fobes
16 / 16 / 5
Регистрация: 19.09.2012
Сообщений: 212
24.11.2015, 15:48  [ТС] #3
Renji, хм, основная цель стоит разбить на лексемы строку и привести цифры к int'у, а не на отдельные символы. Как быть ?
Посимвольно ведь можем получить после первой работы strtok
0
Renji
2141 / 1500 / 456
Регистрация: 05.06.2014
Сообщений: 4,338
24.11.2015, 16:18 #4
Цитата Сообщение от Fobes Посмотреть сообщение
Renji, хм, основная цель стоит разбить на лексемы строку и привести цифры к int'у, а не на отдельные символы. Как быть ?
Если нужно максимально быстро, то писать свой парсер. Если максимально просто, то преобразовать строку в поток (std::stringstream) и читать через >>.
0
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
24.11.2015, 18:10 #5
Можно по быстрому через spirit:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define BOOST_NO_AUTO_PTR
#include <iostream>
#include <string>
#include <vector>
#include <boost/spirit/include/qi.hpp>
 
namespace qi = boost::spirit::qi;
 
int main()
{
   std::string str = "A B C DD 1023 1 2 3 4 5 6 7 42 84 E\n"
                     "74 E\n"
                     " \n";
   std::vector<int> v;
   qi::phrase_parse(str.begin(), str.end(), (*qi::omit[qi::alpha] >> *qi::int_), qi::space, v);
   for (int i : v) std::cout << i << " ";
}
1
24.11.2015, 18:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2015, 18:10
Привет! Вот еще темы с решениями:

Парсинг строки с пробелами
Вообщем на выходе всего я получаю вот это : Вот сам файл script.csx: ...

Парсинг строки по пробелам
Делаю консоль. Написал парсер команд: string command = {&quot;&quot;}; int i = 0;...

Парсинг строки с сайта
привет всем есть сайт и надо с сайта спарсить строчку &lt;p...

Парсинг значений из командной строки
Всем доброго времени суток, столкнулся с необходимостью получения значений из...


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

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

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