我编写了以下代码来检查某个字符串是否存在于文本中或是否存在。问题是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;
}
答案 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
指针以及end
与pointer + 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))