搜索字符串的三种方法

时间:2021-09-29 21:20:08

 


 

		FILE *fp=_tfopen(szXmlFilePath,L"rb");
		if (fp==NULL)
			return;

		fseek(fp,0,SEEK_END);
		UINT nLen=ftell(fp);  
		fseek(fp,0,SEEK_SET);
		// 宽字符类型  
		wchar_t* pStr_Read = new wchar_t[nLen/2+1];      //   分配空间  
		memset(pStr_Read,0,sizeof(wchar_t)*(nLen/2+1));  //   清空  
		fread(pStr_Read,1,nLen,fp);
		fclose(fp);

    pStr_Read保存的是字符串,要在这个字符串中判断 是否包含子字符串subStr



方法一:转换为CSting 使用CString::Find()

		CString subStr=L"你好";

		CString xmlData=pStr_Read;
		delete []pStr_Read;  // 释放空间  

		if (xmlData.Find(subStr)!=-1)
		{
			//...
		}


方法二:使用字符串搜索函数_tcsstr()

		CString subStr=L"你好";
		if (_tcsstr(pStr_Read,subStr))
		{
			//...
		}


方法三: 使用KMP匹配算法


int next[20] ={0};

void Next(wchar_t* p,int *next)
{
	int len=_tcslen(p);

	int j,k;
	next[0]=-1;
	j=0;
	k=-1;
	while(j<len-1)
	{
		if(k==-1||p[j]==p[k])    //匹配的情况下,p[j]==p[k]
		{
			j++;
			k++;
			next[j]=k;
		}
		else                   //p[j]!=p[k]
			k=next[k];
	}

}

//des是目标串,pat是模式串,len1和len2是串的长度
int kmp(wchar_t des[],int len1,wchar_t pat[],int len2)
{

	int p=0,s=0;
	while(p < len2  && s < len1)
	{
		if(pat[p] == des[s])
		{
			p++;s++;
		}
		else
		{
			if(p==0) 
			{
				s++;//若第一个字符就匹配失败,则从des的下一个字符开始
			}
			else
			{
				p = next[p];//用失败函数确定pat应回溯到的字符
			}
		}
	}
	if(p < len2)//整个过程匹配失败
	{
		return -1;
	}
	return s-len2;
}

 

 


 

		CString subStr=L"你好";
		if (kmp(pStr_Read,nLen/2,subStr,subStr.GetLength()))
		{
			//...
		}