字符串匹配实现

时间:2012-01-31 18:24:50

标签: c++ string pattern-matching string-matching

我编写了以下代码来检查某个字符串是否存在于文本中或是否存在。问题是match()函数总是返回false,即使文本中存在模式。

int main(){

    char *text="hello my name is plapla";
    char *patt="my";

    cout<<match(patt,text);

    system("pause");
    return 0;
}

bool match(char* patt,char* text){

    int textLoc=0, pattLoc=0, textStart=0;
    while(textLoc <= (int) strlen(text) && pattLoc <= (int)strlen(patt)){
        if( *(patt+pattLoc) == *(text+textLoc) ){
            textLoc= textLoc+1;
            pattLoc= pattLoc+1;

        }

        else{
            textStart=textStart+1;
            textLoc=textStart;
            pattLoc=0;
        }

    }
    if(pattLoc > (int) strlen(patt))
        return true;
    else return false;
}

3 个答案:

答案 0 :(得分:3)

pattLoc < (int)strlen(patt)循环中尝试while。 循环将在pattLoc == 2时停止,因此您无法将'\0'的{​​{1}}与"my"的{​​{1}}进行比较,' '"hello my name is pala"设置为pattloc 1}}和0

或者更好的是,使用字符串return false

答案 1 :(得分:1)

显而易见的解决方案是:

bool
match( std::string const& pattern, std::string const& text )
{
    return std::search( text.begin(), text.end(), 
                        pattern.begin(), pattern.end() )
            != text.end();
}

这是惯用的C ++,以及我期望任何C ++程序员的方式 写它,至少在专业环境中。

如果目标是学习如何编写这样的功能,当然, 以上并不是什么解决方案。然后解决方案应该是mroe 分而治之;你可以用match来做太多的事情 在一个功能。我建议像:

bool
startsWith( std::string::const_iterator begin,
            std::string::const_iterator end,
            std::string const& pattern )
{
    return end - begin >= pattern.size()
        && std::equal( pattern.begin(), pattern.end(), begin );
}

bool
match( std::string const& pattern, std::string const& text )
{
    std::string::const_iterator current = text.begin();
    while ( current != text.end()
            && !startsWith( begin, text.end(), pattern ) ) {
        ++ current;
    }
    return current != text.end();
}

这显然可以改善;例如,没有任何意义 当剩余文本的长度为时,继续在while循环中 小于模式的长度。

如果你的教授坚持你使用char const*(如果他坚持的话) 在char*,然后他完全无能,应该被解雇),这个 可以轻松地重写这样做:只需将所有调用替换为begin 指针以及endpointer + strlen(pointer)的所有来电。

答案 2 :(得分:0)

我已经解决了这个问题:

while(textLoc <= (int) strlen(text) && pattLoc <= (int)strlen(patt))

应该是:

while(textLoc < (int) strlen(text) && pattLoc < (int)strlen(patt))

if(pattLoc > (int) strlen(patt))if(pattLoc >= (int) strlen(patt))