字符串子集查找
查詢字符串中是否存在子集,如果字符串存儲在一段緩存區裏面,需要查詢的子字符串可能是在首尾相連的地方:
例如接受到的數據在存儲滿了緩存區又從頭開始保存,保存到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)
{
;
}
}