采用递归的思路。从前向后依次匹配:
遇到相同字符,都向后移动一个字符;
如果通配符遇到"?",则不需匹配,自动跳过一个字符;
如果通配符遇到"*",则可以匹配任意多个字符,包括0个,此时可以有三种选择:
1.匹配0个,通配符向后移动一个字符,字符串不动;
2.匹配1个,通配符和字符串都向后移动一个字符;
3.匹配多个,通配符不动,字符串向后移动一个字符。
递归的终止条件:通配符或者字符串遇到'\0'。表示同时结束,返回true。

#include <iostream>
#include <string>
using namespace std;
bool match(const char* str,const char* str1)
{ 
    //两种特殊情况下的结束
    //两个字符串同时结束,返回true
    if((*str=='\0') && (*str1=='\0'))
        return true;
    //两个字符串中有一个先结束,返回false
    if((*str=='\0') || (*str1=='\0'))
        return false;

    if(*str=='?')
    {
        //遇到到 ? 则算匹配到一个字符,跳过一个位置
       return match(str+1,str1+1);
    }
    else if(*str=='*')
    {
        //遇到*号,匹配0个(str+1,str1不用动),匹配1个(str和str1都往前移动1位),匹配多个(str不用动,str+1)
        //return match(str+1,str1) || match(str+1,str1+1) || match(str,str1+1);
          return match(str+1,str1) || match(str+1,str1+1) || match(str, str1+1);
    }
    else if(*str==*str1)
    {
        //当前两字符相等,则进行下一个字符的匹配
        return match(str+1,str1+1);
    }
    return false;
}
int main()
{
    string str,str1;
    while(cin>>str>>str1)
    {
        bool ret;
        ret=match(str.c_str(),str1.c_str());
        if(ret)
            cout<<"true"<<endl;
        else 
            cout<<"false"<<endl;
    }
    return 0;
}