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

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

Войти
Регистрация
Восстановить пароль
 
Fobes
16 / 16 / 2
Регистрация: 19.09.2012
Сообщений: 212
#1

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

24.11.2015, 13:02. Просмотров 490. Ответов 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++):

Парсинг строки С++ - C++
Ребят,нигде не нашел ничего дельного,прошу,чтобы натолкнули на мысль или объяснили что,да как. В общем на вход,к примеру,поступает строка...

Парсинг строки - C++
Доброе время суток! столкнулся с такой проблемой что странно отрекаются данные из строки bool LoadTypeFiles() { ...

Парсинг строки - C++
Добрый день. Помогите с решением следующей задачи. На вход идет строка из 0 и 1, например, 110100011, нужно распарсить её на составляющие....

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

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

Парсинг строки по пробелам - C++
Делаю консоль. Написал парсер команд: string command = {&quot;&quot;}; int i = 0; while(i &lt; 5){ command = &quot;&quot;; i++;} При этом команда по...

4
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,823
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 / 2
Регистрация: 19.09.2012
Сообщений: 212
24.11.2015, 15:48  [ТС] #3
Renji, хм, основная цель стоит разбить на лексемы строку и привести цифры к int'у, а не на отдельные символы. Как быть ?
Посимвольно ведь можем получить после первой работы strtok
0
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,823
24.11.2015, 16:18 #4
Цитата Сообщение от Fobes Посмотреть сообщение
Renji, хм, основная цель стоит разбить на лексемы строку и привести цифры к int'у, а не на отдельные символы. Как быть ?
Если нужно максимально быстро, то писать свой парсер. Если максимально просто, то преобразовать строку в поток (std::stringstream) и читать через >>.
0
DiffEreD
1431 / 768 / 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 << " ";
}
1
24.11.2015, 18:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2015, 18:10
Привет! Вот еще темы с ответами:

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

Парсинг опций командной строки - C++
Всем привет) Пишу приложение при помощи Qt. Хочу внедрить поддержку командной строки, чтобы можно было использовать программу как...

Чтение юникодного файла и парсинг строки - C++
Не удается нормально считать файл. значения читаются с нуль пробелом, как их распарсить и сконвертировать в обычные типы данных?? вот...

Парсинг строки: отобрать символы кириллицы - C++
После введения с клавиатуры произвольной строки вывести на экран эту строку с отобранными у него буквами кириллицы. напишите код на...


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

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

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