Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Вопросик по Си. Выборка значений из строки!

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Вопросик по Си. Выборка значений из строки!
Имя
Сообщение << Старые топики   Новые топики >>
Вопросик по Си. Выборка значений из строки! - 2008-10-20 04:26:55   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
Доброе время суток) Возник вопрос по СИ! Каким кодом, можно наиболее быстро выбрать значения из нижележащей строки и записать в разные переменные. Надо выбрать значения: RED, ARIAL, ТЕКСТ.
<font color='RED' face='ARIAL/MUSOR' size='5' musor='musor'><strong>ТЕКСТ</strong></font>
Заранее спасибо за внимание…
Post #: 1
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 06:06:29.090000   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
Быстрее всего взять готовый html-парсер и распарсить строку с его помощью.
http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=html-parser+C
Post #: 2
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 07:30:44.513333   
Безрукий Муструбатор

Сообщений: 22
Оценки: 0
Присоединился: 2008-10-15 09:44:12.703333

quote:

ORIGINAL: LungDesire

Доброе время суток) Возник вопрос по СИ! Каким кодом, можно наиболее быстро выбрать значения из нижележащей строки и записать в разные переменные. Надо выбрать значения: RED, ARIAL, ТЕКСТ.
&lt;font color='RED' face='ARIAL/MUSOR' size='5' musor='musor'&gt;&lt;strong&gt;ТЕКСТ&lt;/strong&gt;&lt;/font&gt;
Заранее спасибо за внимание…

Какие-то требования у тебя абсурдные.
Post #: 3
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 12:00:44.866666   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
Извиняюсь за некчёмный пример строки, просто есть переменная, кот содержит много тупого кода, вроде того, что я указал. Важна производительнасть работы, лишние задержки неуместны. Потому и интерестны мнения др кодеров)
Post #: 4
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 13:59:28.676666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Наиболее быстро - писать свой парсер. Тут такое соотношение - чем больше функционала - тем медленнее. Можешь тупо захардкодить, если у тебя гарантирован валидный синтаксис, т.е. если парсишь html - то он 100% правильный. Если же нет - то не стоит изобретать велосипед, а стоит делать, как сказал kreol.
Post #: 5
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 16:27:01.543333   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
Я редактирую сорс проксика. Значит через него кидаются данные… К примеру, теже тэги. Осталось заредактировать его так, чтобы некие данные из этих тегов сохранялись. В perl'e я подобные вещи проворачивал используя маски поиска. Т.е. тупо резал необходимые значения, но в Си как это можно провернуть?
Post #: 6
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 16:29:11.560000   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
Скажу одно, html-парсер тут не прокатит )
Post #: 7
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 16:34:20.860000   
oRb

Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
http://www.boost.org/doc/libs/release/libs/regex/ может это поможет.
Post #: 8
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 16:59:02.836666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Только хотел написать про регулярные выражения.
Post #: 9
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 22:04:26.376666   
keys

Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
quote:

, но в Си как это можно провернуть?


сначала получить вот такой массив строк
&lt;font color='RED' face='ARIAL/MUSOR' size='5' musor='musor'&gt; &lt;strong&gt; ТЕКСТ &lt;/strong&gt; &lt;/font&gt; а потом уже обрабатывать их соответствующе (как видишь тут отбросив теги немного остаётся)
Post #: 10
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-21 01:50:04.090000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Чел же написал, что у него не html… Тем более решение не универсальное. Как верно заметил орб - нужно курить регэкспы.
Post #: 11
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-21 04:58:31.566666   
Безрукий Муструбатор

Сообщений: 22
Оценки: 0
Присоединился: 2008-10-15 09:44:12.703333
LungDesire, возьми sed на вооружение, кстати он на сях написан =)
Ну а если нужно самому написать, то в чем дело? Попробуй хотябы посмотреть какие утилиты есть в libc
http://www.gnu.org/software/libc/manual/

PS кстати, GNU славится открытыми исходниками
Post #: 12
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-21 13:08:04.800000   
keys

Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
quote:

Чел же написал, что у него не html

не писал он, он написал что парсер не прокатит (может по причине того, что он не сможет его прикрутить)
универсальное решение - разбор на лексемы
Post #: 13
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-21 13:57:13.520000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333

quote:

ORIGINAL: keys

quote:

Чел же написал, что у него не html

не писал он, он написал что парсер не прокатит (может по причине того, что он не сможет его прикрутить)
универсальное решение - разбор на лексемы



quote:

ORIGINAL: LungDesire

Я редактирую сорс проксика. Значит через него кидаются данные… К примеру, теже тэги. Осталось заредактировать его так, чтобы некие данные из этих тегов сохранялись. В perl'e я подобные вещи проворачивал используя маски поиска. Т.е. тупо резал необходимые значения, но в Си как это можно провернуть?

Post #: 14
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-23 01:32:44.140000   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
Я щас пытаюсь решить задачу чер регулярные выражения… МОж что и прокатит…
Post #: 15
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-23 01:41:51.583333   
keys

Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
ты ему предлагаешь весь текст парсить, а зачем это надо?
по-моему нужно выделить из всех данных html код и разложить его, а остальное добавлять по мере необходимости (ну я имею в виду другой код не html)

updаtе:
я представляю у него появляется java там и вместо того чтобы писать отдельную функцию для разложения java-кода он будет редактировать парсер
Post #: 16
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-23 02:37:32.166666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
keys, у него не HTML, а исходный текст ПРОКСИ. На каком языке я хз, но точно не на HTML =)
Post #: 17
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-24 00:24:22.963333   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
парни… в качестве примера строки я указал некое подобие того трафа, что чер прокси передаётся…. Что я и хочу, так это дописать сорс, дабы он ещё и анализировал значения… Например убедился, что в строке: <message from='popuskin@mail.ru/info' to='username@yandex.ru' xml:lang='ru' type='chat' id='25'><body>Да please </body></message>, есть действительно теги <message></message>. Далее выдирал значения из тега from, to, и собственно те строки, что содержаться между тэгов <body></body>. Осталось модифицировать сорс, он на Си написан. Т.к. всякого кода чер прокс будет летать полно, надо наиболее шустро организовать обработку и сохранение значений этих тегов.
Post #: 18
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-24 01:15:41.816666   
keys

Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
quote:

Т.к. всякого кода чер прокс будет летать полно, надо наиболее шустро организовать обработку

сначала определяешь какой код передаётся, а когда определил передаёшь соответствующей функции

так можно для каждой строки делать (определить какой в ней код, html или этот), если html передать функции которая разберёт html и запишет значения в массив, если этот, передать функции которая разберёт этот и запишет все значения в массив (их потом можно перебирать и искать from to)
поэтому в данном случае даже неважно какая там форма <message> или !message, т.к. каждая отдельная функция будет знать свою
Post #: 19
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-24 03:53:12   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Это сложно. Кури MSXML парсер, или SHTML (кажись так). Руками всё равно !правильный! более шустрый не напишешь, если через прокси идёт любой html контент.
Post #: 20
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-25 00:20:04.473333   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
Я пологаю обычный поиск тегов <message> позаолит убедиться в том, что строка должна анализироваться, а потом на крайняк через рег выражения вытащить всё… я могу сделать чтобы прокси писал всё в файл, а потом быстро написать скрипт на perl'e для анализа.. Это всё легко, но если скрипт накроется, т.е. вылетит по каким-нить причинам, то всему кердык, потому и хочу просто дописать сорс…
Post #: 21
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-25 15:00:50.256666   
keys

Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
с готовой строкой можно применить такое

#include &lt;stdio.h&gt; #include &lt;string.h&gt; #define MAXLINE 1000 #define MAXTEXT 5000 main() { char text[] = "&lt;message from='popuskin@mail.ru/info'" " to='username@yandex.ru' xml:lang='ru'" " type='chat' id='25'&gt;&lt;body&gt;Да please" "&lt;/body&gt;&lt;/message&gt;"; char *mess_s = "&lt;message"; char *mess_e = "&lt;/message&gt;"; char *bod_s = "&lt;body&gt;"; char *bod_e = "&lt;/body&gt;"; char line[MAXLINE], tags[MAXTEXT] = "", body[MAXTEXT] = ""; char *ps1, *pe1, *ps2, *pe2; int offset, nc; ps1 = strstr(text, mess_s); pe1 = strstr(text, mess_e); strncpy(tags, ps1+strlen(mess_s), pe1-(ps1+strlen(mess_s))); ps2 = strstr(text, bod_s); pe2 = strstr(text, bod_e); strncpy(body, ps2+strlen(bod_s), pe2-(ps2+strlen(bod_s))); *strstr(tags, bod_s) = '\0'; for (offset = 0; offset &lt; strlen(tags); offset += nc) { sscanf(tags+offset, "%s%n", line, &nc); sscanf(line, "%*[^']%*[']%[^']", line); printf("%s\n", line); } printf("%s\n", body); return 0; }
вывод

[guest@localhost tmp]$ ./test popuskin@mail.ru/info username@yandex.ru ru chat 25 Да please [guest@localhost tmp]$
Post #: 22
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-25 17:41:28.130000   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
Oooo… Это как раз то, что надо…. Респект тебе KEYS)))
Post #: 23
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-25 18:09:01.750000   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
А можно ли выводить только те значения, что лежат в тегах from и to, а не все?
Пологаю, для этого достаточно просто поменять маску поиска —> sscanf(line, "%*[^']%*[']%[^']", line); ?
Post #: 24
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-25 18:27:42.510000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Вы не учитываете того, что .html может быть невалидный… Забудут где-нить закрыть тэг (>) - и ваш парсер обломается.
Post #: 25
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 00:14:26.660000   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
ну что мешает допустим поставить вместо <message —> message и в конце message> ?
все покатит, или я ошибаюсь?
Post #: 26
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 00:34:01.153333   
keys

Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
#include &lt;stdio.h&gt; #include &lt;string.h&gt; #define MAXLINE 1000 #define MAXTEXT 5000 main() { char text[] = "&lt;message from='popuskin@mail.ru/info'" " to='username@yandex.ru' xml:lang='ru'" " type='chat' id='25'&gt;&lt;bоdу&gt;Да please" "&lt;/bоdу&gt;&lt;/message&gt;"; char *mess_s = "&lt;message"; char *mess_e = "&lt;/message&gt;"; char *bod_s = "&lt;bоdу&gt;"; char *bod_e = "&lt;/bоdу&gt;"; char *filt1 = "from="; char *filt2 = "to="; char line[MAXLINE], tags[MAXTEXT] = "", bоdу[MAXTEXT] = ""; char *ps1, *pe1, *ps2, *pe2; int offset, nc; ps1 = strstr(text, mess_s); pe1 = strstr(text, mess_e); strncpy(tags, ps1+strlen(mess_s), pe1-(ps1+strlen(mess_s))); ps2 = strstr(text, bod_s); pe2 = strstr(text, bod_e); strncpy(bоdу, ps2+strlen(bod_s), pe2-(ps2+strlen(bod_s))); *strstr(tags, bod_s) = '\0'; for (offset = 0; offset &lt; strlen(tags); offset += nc) { sscanf(tags+offset, "%s%n", line, &nc); if (strncmp(line, filt1, strlen(filt1)) == 0 || strncmp(line, filt2, strlen(filt2)) == 0) { sscanf(line, "%*[^']%*[']%[^']", line); printf("%s\n", line); } } printf("%s\n", bоdу); return 0; }
quote:


Вы не учитываете того, что .html может быть невалидный… Забудут где-нить закрыть тэг (&gt;)

забыть могут внутри <bоdу> </bоdу>, могут в почту поставить <message> и остальные
а для html'а так если там забыли закрыть тег, значит его там нет ;) ну то есть и выдать сообщение что один тег оказался незакрытым
тут поиск идёт только полных тегов
"<message" это для "<message from=…" и для "<message>"
Post #: 27
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 02:09:39.986666   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
что касается поиска в body, то изначальный поиск можно сделать тоже по char *bod_s = "bоdу>"; и до char *bod_e = "</bоdу"; , даже если начальный или конечный тег отрубят по глюку…
Post #: 28
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 02:14:34.980000   
keys

Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
char *bod_s = "bоdу&gt;"; это создаёт неопределённую ситуацию, он так найдёт <bоdу>, </bоdу>, а надо чтобы bod_s находил (bоdу_start) то есть точно <bоdу, если у тебя bоdу без параметров, то он идёт целиком

quote:

Забудут где-нить закрыть тэг (&gt;)

недописанный тег == его отсутствие, <message читается в любом случае дописан он или нет
Post #: 29
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 18:32:31.126666   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
с этим ясно… а что касается того, чтобы выборка происходила не из всех тегов:
popuskin@mail.ru/info
username@yandex.ru
ru
chat
25
Да please
, а только из конкретных:
from - popuskin@mail.ru/info
to - username@yandex.ru
body - Да please
как этого добиться в твоём сорсе Keys?
Post #: 30
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 20:45:32.286666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Написать свой, с использованием регулярных выражений?
Post #: 31
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 21:00:57.323333   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
У меня проблемы с синтаксисом :-/
Возможно уместно это сюда прикрутить?

CString str;
int startindex = str.Find(_T("color='"));
CString rest = str.Mid(startindex, str.getLength());
int endIndex = rest.Find(_T("'"));
CString color = rest.Mid(0, endIndex);

Только у меня ошибок тонны кажутся… при компилинге…
МОж кто посоветует, как наиболее грамотно прикрутить этот код к сорсу?
Post #: 32
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-27 11:29:23.853333   
keys

Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
quote:

с этим ясно… а что касается того, чтобы выборка происходила не из всех тегов:

я ж те написал, второй исходник
Post #: 33
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-27 21:37:25.960000   
LungDesire

Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
Sorry) Даже незаметил… Буду втыкать)))
Post #: 34
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Вопросик по Си. Выборка значений из строки!







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.