发布于 2014-09-25 05:59:15 | 493 次阅读 | 评论: 0 | 来源: 网友投递
腾讯
腾讯控股有限公司(腾迅)是一家民营IT企业,成立于1998年11月29日,总部位于中国广东深圳,是中国最大的互联网综合服务提供商之一,也是中国服务用户最多,最广的互联网企业之一。
在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(*、?),通配符“*”表示零个或多个任意字母,通配符“?”表示一个任意字母。
如:“J* Smi??” 可以匹配“John Smith” .
请用C语言实现如下函数:
void scan(const char* pszText, const char* pszName);
注:pszText为整个文章字符,pszName为要求匹配的英文名。
请完成些函数实现输出所有匹配的英文名,除了printf外,不能用第三方的库函数等。
解答:
// Test.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
const char *pszTest="John Smithh";
const char *pszName="J* Smi??";
void scan(const char* pszText, const char* pszName){
int flag=0;//下一次匹配的起始位置。
int i=0;
int j=0;
while(i<strlen(pszTest)||j<strlen(pszName)){
if(i>=strlen(pszTest)){
printf("匹配失败");
return;
}
if(j>=strlen(pszName)){
printf("匹配成功");
j=0;
return;
}
if(pszTest[i]==pszName[j]||pszName[j]=='?'){
//如果相等或者pszName中是通配符‘?’时,都认为是匹配成功,继续匹配;
i++;
j++;
continue;
}
if(pszName[j]=='*'){
j++;//跳过‘*’,继续匹配直到下一个字符匹配上为止
while(pszTest[i++]!=pszName[j]&&i<strlen(pszTest));
j++;//找到匹配的字符之后,j也向后移动一位。
continue;
}
j=0;//匹配失败,子串重新开始匹配。
flag++;
i=flag;//匹配失败,目标串返回flag指定的位置。
}
//用于两个字符串都恰好匹配完的情况!
printf("匹配成功!");
}
int _tmain(int argc, _TCHAR* argv[])
{
scan(pszTest,pszName);
return 0;
}