搜索字符串的三种方法

[cpp] FILE *fp=_tfopen(szXmlFilePath,L"rb");  
  1. if (fp==NULL)  
  2.     return;  
  3.   
  4. fseek(fp,0,SEEK_END);  
  5. UINT nLen=ftell(fp);    
  6. fseek(fp,0,SEEK_SET);  
  7. // 宽字符类型     
  8. wchar_t* pStr_Read = new wchar_t[nLen/2+1];      //   分配空间     
  9. memset(pStr_Read,0,sizeof(wchar_t)*(nLen/2+1));  //   清空     
  10. fread(pStr_Read,1,nLen,fp);  
  11. fclose(fp);  
		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()

[cpp] CString subStr=L"你好";  
  1.   
  2. CString xmlData=pStr_Read;  
  3. delete []pStr_Read;  // 释放空间     
  4.   
  5. if (xmlData.Find(subStr)!=-1)  
  6. {  
  7.     //...   
  8. }  
		CString subStr=L"你好";

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

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


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

  1. CString subStr=L"你好";  
  2. if (_tcsstr(pStr_Read,subStr))  
  3. {  
  4.     //...   
  5. }  
		CString subStr=L"你好";
		if (_tcsstr(pStr_Read,subStr))
		{
			//...
		}


方法三: 使用KMP匹配算法


  1. int next[20] ={0};  
  2.   
  3. void Next(wchar_t* p,int *next)  
  4. {  
  5.     int len=_tcslen(p);  
  6.   
  7.     int j,k;  
  8.     next[0]=-1;  
  9.     j=0;  
  10.     k=-1;  
  11.     while(j<len-1)  
  12.     {  
  13.         if(k==-1||p[j]==p[k])    //匹配的情况下,p[j]==p[k]   
  14.         {  
  15.             j++;  
  16.             k++;  
  17.             next[j]=k;  
  18.         }  
  19.         else                   //p[j]!=p[k]   
  20.             k=next[k];  
  21.     }  
  22.   
  23. }  
  24.   
  25. //des是目标串,pat是模式串,len1和len2是串的长度   
  26. int kmp(wchar_t des[],int len1,wchar_t pat[],int len2)  
  27. {  
  28.   
  29.     int p=0,s=0;  
  30.     while(p < len2  && s < len1)  
  31.     {  
  32.         if(pat[p] == des[s])  
  33.         {  
  34.             p++;s++;  
  35.         }  
  36.         else  
  37.         {  
  38.             if(p==0)   
  39.             {  
  40.                 s++;//若第一个字符就匹配失败,则从des的下一个字符开始   
  41.             }  
  42.             else  
  43.             {  
  44.                 p = next[p];//用失败函数确定pat应回溯到的字符   
  45.             }  
  46.         }  
  47.     }  
  48.     if(p < len2)//整个过程匹配失败   
  49.     {  
  50.         return -1;  
  51.     }  
  52.     return s-len2;  
  53. }  
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;
}

 

 


 

[cpp] CString subStr=L"你好";  
  1. if (kmp(pStr_Read,nLen/2,subStr,subStr.GetLength()))  
  2. {  
  3.     //...   
  4. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值