自己写的忽略大小写查找字符串的子串的函数

来源:互联网 发布:时时彩开奖源码 编辑:程序博客网 时间:2024/05/16 17:56

忽略大小写从一个字符串中查找另一个字符串,最常用的是shlwapi.h中的StrStrI,函数原型如下:

LPTSTR StrStrI(          LPCTSTR lpFirst,    LPCTSTR lpSrch);

但是经过测试,这个函数效率很低,自己需要查询的数据量又很大,重新写一个吧。

// 函数功能:查找首个字符在搜索池中的偏移位置LPCTSTR __stdcall FindFirstChar(__in LPCTSTR lpszText, __in TCHAR cch){if (lpszText == NULL || lpszText[0] == _T('\0'))return NULL;if (cch == _T('\0'))return NULL;size_t nTextLen = _tcslen(lpszText);TCHAR cchText = _T('\0');for (size_t i = 0; i < nTextLen; i++){if (lpszText[i] >= 65 && lpszText[i] <= 90)// 如果是大写,转换成小写cchText = lpszText[i] + 32;elsecchText = lpszText[i];if (cch >= 65 && cch <= 90)// 如果是大写,转换成小写cch = cch + 32;if (cch == lpszText[i])return lpszText + i;}return NULL;}LPCTSTR __stdcall _StrStrI(__in LPCTSTR lpszText, __in LPCTSTR lpszPattern){if (lpszText == NULL || lpszText[0] == _T('\0'))return NULL;if (lpszPattern == NULL || lpszPattern[0] == _T('\0'))return NULL;size_t nTextLen = _tcslen(lpszText);size_t nPatternLen = _tcslen(lpszPattern);if ( nPatternLen > nTextLen )return NULL;// 查找首个字符在搜索池中的偏移位置,在数据量比较大的情况下,能有效降低时间复杂度LPCTSTR lpszStartPoint = FindFirstChar(lpszText, lpszPattern[0]);if (lpszStartPoint == NULL)return NULL;LPCTSTR lpszEndPoint = lpszText + nTextLen;for ( LPCTSTR p = lpszStartPoint; p != lpszEndPoint; p++){size_t i = 0;TCHAR cchText = _T('\0'), cchPattern = _T('\0');BOOL bFound = TRUE;for (size_t j = 0; i < nPatternLen; j++){if (lpszPattern[j] >= 65 && lpszPattern[j] <= 90)// 如果是大写,转换成小写cchPattern = lpszPattern[j] + 32;elsecchPattern = lpszPattern[j];if (p[j] >= 65 && p[j] <= 90)// 如果是大写,转换成小写cchText = p[j] + 32;elsecchText = p[j];if (cchPattern != cchText)// 匹配失败,本轮查找结束{bFound = FALSE;break;}i++;}if (bFound == TRUE)return p + i - nPatternLen;}return NULL;}

经过实测,消耗时间大约是StriStrI函数的三分之一,还是值得的。



1 0
原创粉丝点击