版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/u012902367/article/details/88734820
查询字符串中是否存在子集,如果字符串存储在一段缓存区里面,需要查询的子字符串可能是在首尾相连的地方:
例如接受到的数据在存储满了缓存区又从头开始保存,保存到index=3:
需要查找的子字符串为ABCDEF:
int buf_index; // 表示最后一个数据存放在缓存区第几个位置
// target字符串是否存是buf的子字符串,返回值是子串所在位置,
// 返回-1:不存在
// 返回0....n:字符串首字符的下标
int myStrstr(char *buf,char *target)
{
int i,j,buf_len,target_len;
buf_len = strlen(buf);
target_len = strlen(target);
for(i=0; i<=buf_len-target_len; i++)
{
for(j=0;j<target_len;j++)
{
if(buf[i+j]!=target[j])
{
break;
}
}
if(j==target_len)
{
return i;
}
}
return -1;
}
// 表示最后一个数据存放在缓存区的哪个位置
// 返回-1:不存在 否则就是存在
int checkStr(char *buf,char *target)
{
int i;
int buf_len = strlen(buf);
int target_len = strlen(target);
char temp[255] = {0};
// 没有出现缓存区头尾相连
if(target_len <= buf_index)
{
printf("---%s %s \n",buf,target);
return myStrstr(buf, target);
}
else // 可能出现缓存区头尾相连接
{
memcpy(temp+target_len,buf,target_len);
memcpy(temp,buf+buf_len-target_len,target_len);
printf("===%s\n",temp);
return myStrstr(temp,target);
}
return -1;
}
void main(void)
{
char *buf="DEF4567890qwertyuABC";
char *target = "ABCDEF";
buf_index = 3; // 缓存区循环一次从头开始又存了3个,最后一个子集放在第3个位置
printf("%d",checkStr(buf,target));
//如果确定要找的数据没有在首尾位置
/*
char *buf="123ABCDEF4567890";
char *target = "ABCDEF";
buf_index = strlen(buf); // 这个一般是由数据接收时统计,这里测试就直接这么写
printf("%d",checkStr(buf,target)); // 也可以直接调用myStrstr()
*/
while(1)
{
;
}
}