字符串子集查找

版权声明:本文为博主原创文章,转载请附上博文链接! 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)
	{
			;
	}
}

猜你喜欢

转载自blog.csdn.net/u012902367/article/details/88734820