字符串子集查找

字符串子集查找

查詢字符串中是否存在子集,如果字符串存儲在一段緩存區裏面,需要查詢的子字符串可能是在首尾相連的地方:
例如接受到的數據在存儲滿了緩存區又從頭開始保存,保存到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)
	{
			;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章