Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
проблема с буферами Part 3 |

18.12.2008, 17:21
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
проблема с буферами Part 3
есть два буфера нужно определить входит ли первый буфер в состав второго
что-то типа этого
PHP код:
#include <stdlib.h>
#include <string.h>
void main ()
{
char *a = "aaagggbbb"
char *b = "ggg";
int n = проверить( b, a );
}
какие функции есть в C, что бы это выполнить
|
|
|

18.12.2008, 17:30
|
|
Участник форума
Регистрация: 03.01.2008
Сообщений: 156
Провел на форуме: 414311
Репутация:
110
|
|
char *strstr(char *, char *)
Ищет первое вхождение одной строки в другой и возвращает указатель на него. А вообще почитай что-нибудь про стандартную библиотеку. MSDN тотже.
|
|
|

18.12.2008, 18:54
|
|
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме: 2187381
Репутация:
518
|
|
2 izlesa
справдедиво лишь для буферов хранящих строки! Хотя все равно не понятно .... а сравнивать ли символы после 0x00. To do or not to do! What is the question!
в общем же случае ... вычисляется хэш равный сумме малого буфера
ХЭШ=Сумма(b[i])
.... вычислетя хэш "плавающего" фрагмента большого буфера
ХЭШ2=Сумма_фрагмента(a[i])
и пусть buf_length - длинна большого буфера
а buf2_length -длина малого буфера
тогда ...далее
Код:
int find_inside(char *a,char *b,int buf_length,int buf2_length)
{
int i,j,ex;
long ХЭШ,ХЭШ2;
for(j=0,ХЭШ=0,ХЭШ2=0;j<buf2_length;j++)
{ ХЭШ+=b[j]; ХЭШ2+=a[j]; }
for(i=0,ex=-1;i<buf_length-buf2_length && ex==-1;i++,ХЭШ2=ХЭШ2-a[i-1]+a[i+buf2_length])
{
if(ХЭШ==ХЭШ2)
if(memcmp(a+i,b,buf2_len)==0)
ex=i;
}
return ex;
}
если возвращает -1 не было совпадений если >-1 то это отступ от начала буфера
суть должна быть понятна... технология быстрого поиска подстроки в строке, но на манер буферов! 8))
СУПЕР-быстродействие ! Быстрее не получится!
P.S. это к разговору давнишнему (применение олимпиадных технологий в жизни) !
Последний раз редактировалось Delimiter; 18.12.2008 в 20:34..
|
|
|

18.12.2008, 21:12
|
|
Участник форума
Регистрация: 03.01.2008
Сообщений: 156
Провел на форуме: 414311
Репутация:
110
|
|
2Delimiter
Ну в вопросе присутствовали строки ).
Но алгоритм хорош ^______^
|
|
|

19.12.2008, 15:17
|
|
Участник форума
Регистрация: 19.05.2007
Сообщений: 281
Провел на форуме: 2823587
Репутация:
106
|
|
Код:
int FindStr(char *str1,char *str2)
{
int nstr1,nstr2,i,j,nstr,sstr;
nstr1=strlen(str1);
nstr2=strlen(str2);
if(nstr1>nstr2)
{
nstr=nstr1-nstr2;
for(i=0;i<nstr;i++)
{
sstr=0;
for(j=0;j<nstr2;j++)
{
if(str1[j+i]==str2[j])
{
sstr++;
}
}
if(sstr==nstr2)
{
return 1;
}
}
}
else
{
return -1;
}
return 0;
}
Не уверен как будет работать strlen с 0х00 ну при необходимости можно и переписать
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|