Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Fobes
16 / 16 / 2
Регистрация: 19.09.2012
Сообщений: 207
24.11.2015, 13:02     Быстрый парсинг строки #1
Всем доброго времени суток... Прошу разъяснить что делаю не так.
Получаю строку вида, нужно ее обработать с минимальными задержками, по этому посмотрел в сторону 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, то будет выводить все правильно, только первую строку.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2015, 13:02     Быстрый парсинг строки
Посмотрите здесь:

Парсинг строки С++ C++
C++ Парсинг значений из командной строки
C++ Парсинг строки с пробелами
C++ Парсинг чисел из строки
C++ Парсинг опций командной строки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
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;
Fobes
16 / 16 / 2
Регистрация: 19.09.2012
Сообщений: 207
24.11.2015, 15:48  [ТС]     Быстрый парсинг строки #3
Renji, хм, основная цель стоит разбить на лексемы строку и привести цифры к int'у, а не на отдельные символы. Как быть ?
Посимвольно ведь можем получить после первой работы strtok
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
24.11.2015, 16:18     Быстрый парсинг строки #4
Цитата Сообщение от Fobes Посмотреть сообщение
Renji, хм, основная цель стоит разбить на лексемы строку и привести цифры к int'у, а не на отдельные символы. Как быть ?
Если нужно максимально быстро, то писать свой парсер. Если максимально просто, то преобразовать строку в поток (std::stringstream) и читать через >>.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 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 << " ";
}
Yandex
Объявления
24.11.2015, 18:10     Быстрый парсинг строки
Ответ Создать тему
Опции темы

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