/* 在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(*、?),通配符“*”表示零个或多个任意字母,通配符“?”表示一个任意字母。 如:“J* Smi??” 可以匹配“John Smith” . 请用C语言实现如下函数: void scan(const char* pszText, const char* pszName); 注:pszText为整个文章字符,pszName为要求匹配的英文名。 请完成些函数实现输出所有匹配的英文名,除了printf外,不能用第三方的库函数等。 */ #include <iostream> using namespace std; const char *pEnd=NULL; bool match(const char *pszText,const char *pszName) { if(*pszName == '/0') // 匹配完成 { pEnd=pszText; //记录下结束位置 return true; } if(*pszText == '/0') // 未匹配完成 { while(*pszName !='/0') //当pszName剩下都是* 则匹配成功 { if(*pszName != '*') return false;//只要有不是*,则匹配失败 pszName++; } pEnd=pszText; return true; } if(*pszName!= '*' && *pszName!='?') { if(*pszText == *pszName) { return match(pszText+1,pszName+1); } return false; } else { if(*pszName == '*') { //因为*不能匹配空格,所以*只能匹配0个字符 if(*pszText==' ') return match(pszText,pszName+1); else return match(pszText,pszName+1)||match(pszText+1,pszName); //匹配0个,或者继续*匹配下去 } else // ? { //因为?不能匹配空格,所以返回false if(*pszText==' ') return false; return match(pszText+1,pszName+1); } } } void scan(const char *pszText, const char *pszName) { while(*pszText!='/0') { //已pszText为起点,pEnd为终点 if(match(pszText,pszName)) { while(pszText!=pEnd) { cout<<*pszText++; } cout<<endl; } pszText++; } return; } int main() { //char pszText[100]={'/0'},pszName[100]={'/0'}; //fgets(pszText,100,stdin); //注意fgets会读入回车 //fgets(pszName,100,stdin); char* pszText ="dsfJohn Smith ffffffJo hn Smith"; char* pszName = "J* Smi??"; scan(pszText,pszName); system("pause"); return 0; }