Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: аналог strstr для байтового массива  (Прочитано 20138 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 31-08-2010 19:36 » 

существует ли аналог функции strstr для поиска в массиве байтов, с куазанием длины массива и без реагирования на 0 ?

Рылся в интернете, не нашёл...
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 31-08-2010 20:45 » 

Функция memmem. Только она не стандартная - GNU extension.

void * memmem (const void *HAYSTACK, size_t HAYSTACK-LEN, const void *NEEDLE, size_t NEEDLE-LEN)

http://www.google.ru/search?source=ig&hl=ru&rlz=&=&q=%D0%B0%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3+memmem+%D0%B4%D0%BB%D1%8F+vc&aq=f&aqi=&aql=&oq=&gs_rfai=#hl=ru&newwindow=1&q=memmem+windows&aq=f&aqi=&aql=&oq=&gs_rfai=&pbx=1&fp=5a9ebadc12b95a44
« Последнее редактирование: 31-08-2010 20:50 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 31-08-2010 20:53 » 

эхъ, жалко. Спасибо.  А я, кстати, уже свою накатал - очень похоже получилось
Код:
const BYTE* CScanner::st_findInBuf(const BYTE* pBuff,DWORD dwdBuffLen,const BYTE* pSub,DWORD dwdSubSetLen)
{
if(!pBuff)return 0;
if(!pSub)return 0;
if(!dwdBuffLen)return 0;
if(!dwdSubSetLen)return 0;

const BYTE* pBuff_end=pBuff+dwdBuffLen;
if(pBuff_end<=pBuff)return 0;

const BYTE* pCurr=pBuff;

while(   pCurr<pBuff_end && (pCurr=(const BYTE*)memchr(pCurr,*pSub,pBuff_end-pCurr))   )
{
if( ((DWORD)(pBuff_end-pCurr)) < dwdSubSetLen )return 0;

if(0==memcmp(pCurr,pSub,dwdSubSetLen))return pCurr;

pCurr++;
}

return 0;
}
« Последнее редактирование: 31-08-2010 21:10 от Алексей1153++ » Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 31-08-2010 20:55 » 

Леш, посмотри по ссылке первые позиции - там есть исходники.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 31-08-2010 20:57 » 

да, я успел даже в посте их увидеть )
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 31-08-2010 20:57 » 

Я его прибил, т.к. поиск дает несколько вариантов. Тот что я привел и убрал был сделан для BCB, а это не есть гуд - у них свой диалект C++.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 31-08-2010 21:00 » 

Дык, мне исходники как бы и не надо, я сам факт искал. Если нету - я напишу свой (уже написал)
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 01-09-2010 04:28 » 

Дык, мне исходники как бы и не надо, я сам факт искал. Если нету - я напишу свой (уже написал)
Я для поиска исходников использую CodeSearch http://google.com/codesearch?q=memmem&hl=ru&btnG=Поиск+кода
Что касается твоей реализации Улыбаюсь если тебе скорость не нужна, то всё ок, если нужна, то это не сама лучшая реализация
например посмотри реализации memmem во FreeBSD (одна из первых ссылок в результатах поиска)
И вот еще:
http://easy-coding.blogspot.com/2010/08/blog-post.html
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 01-09-2010 04:52 » 

Скорость мне особо не надо. Мельком глянул - они там как-то на строке зациклились, а файл -  отнюдь не строка, оканчивающаяся нулём )
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #9 : 01-09-2010 04:54 » 

терминирующий 0 это частность
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 01-09-2010 06:41 » 

Какой еще терминирующий ноль? Ведь задается длина обеих массивов!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 01-09-2010 06:47 » 

можно для некого ускорения ещё второй символ тоже сравнить, но, сдаётся, это не сильно скажется )
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 10-09-2010 16:25 » 

а вот мне тут подсказали, самое оно ))
Код:
#include <algorithm>

const char by1[10]={0,1,2,3,4,5,6,7,8,9};
const char by2[3]={2,3,4};

const char* p=std::search(by1,by1+sizeof(by1),by2,by2+sizeof(by2));
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #13 : 13-09-2010 07:00 » 

я и забыл про него Улыбаюсь
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 13-09-2010 07:12 » new

а я искал нечто подобное в algorithm, но сам не нашёл тогда. Всё find пытал ))
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines