13:55

StrStr

Ну, пробьешь ты головой стену. И что ты будешь делать в соседней камере?
Есть в С/С++ функция strstr(вот описание www.cplusplus.com/reference/clibrary/cstring/st...) - мне нужно такое же, но для произвольного куска памяти. Фишка в том, что вообще говоря память кастится в чары, но strstr вылетает встретив 0, а мне нужно что оно этого не далало - т.к. массив вообще говоря произвольный.

Комментарии
23.10.2011 в 21:53

Пау-чок
Что-то вроде этого?

/**
@param buf Указатель на блок памяти, в котором производится поиск
@param buf_len Размер блока памяти, в котором производится посик
@param pat Указатель на блок памяти, содержимое которого ищется
@param pat_len Размер блока памяти, содержимое которого ищется
@return Указатель на найденный блок памяти, содержащийся в buf и по содержимому идентичный с pat, либо NULL в случае отсутствия совпадений
*/
char * memmem ( const char * buf, size_t buf_len, const char * pat, size_t pat_len){
char * result = NULL;
char * buf_end = buf+buf_len; //Указатель на конец блока buf,
char * pat_end = pat+pat_len; //Указатель на конец блока pat
char * srch_strt = buf; //Указатель на текущий блок, который сравнивается с pat
char * srch_last = buf_end-pat_len; //Указатель на последний блок, который сравнивается с pat
char * srch_cur; // Указатель на текущий сравниваемый байт в buf
char * pat_cur; //Указатель на текущий сравниваемый байт в pat
while(srch_strt<=srch_last){
for(
(pat_cur=pat), (srch_cur=srch_strt);
(pat_cur<pat_end)&&(*pat_cur==*srch_cur);
pat_cur++,srch_cur++
);
if(pat_cur==pat_end){
result=srch_start;
break;
}
srch_start++;
}
return result;
}

23.10.2011 в 21:57

Ну, пробьешь ты головой стену. И что ты будешь делать в соседней камере?
O, за n^2 каждый дурак может. Там при помощи динамического программирования можно за n. А учитывая то что у меня архиватор - для меня это непозволительная роскошь(
23.10.2011 в 23:09

Пау-чок
Mr.Freedom, так сразу бы и сказали ) Просто strstr во всех виденных мною исходниках си'шной стандартной библиотеки реализуется именно "в лоб" (хуже того - сравнение делается через strcmp, а длина исходной строки получается через strlen).

Если обязательно нужно за O(n) или близкое, взгляните сюда, там есть описание некоторых алгоритмов.