2012-12-13 122 views
0

我想比较两个字符串字符使用我创建的bool match(string,string)字符,我相信它比较正确,当我输入两个字符串不相等,它会输出false!但是当我检查布尔时,它没有返回false。 我想不出这种行为的原因,我希望有人能帮助我。 代码:奇怪布尔returing行为

#include <iostream> 
#include <cassert> 
#include <cmath> 
#include <fstream> 
#include <vector> 

using namespace std; 

bool match(string pattern, string source) 
{ 
    if(pattern.size() == 0&& source.size() == 0) 
    { 
     return true; 
    } 
    else if(pattern[0] == source[0]) 
    { 
     pattern.erase(0,1); 
     source.erase(0,1); 
     match(pattern,source); 
    } 
    else 
    { 
     cout << "false" << endl; 
     return false; 
    } 
} 
int main() 
{ 
    string test1 = "hballo"; 
    string test2 = "hallo"; 
    bool match_found = match(test1,test2); 
    if(match_found) 
    { 
     cout << "match found!"<< endl; 
    } 
    else if(!match_found) 
    { 
     cout << "match not found!"<< endl; 
    } 
} 

回答

1

您忘记了return

pattern.erase(0,1); 
source.erase(0,1); 
return match(pattern,source); 
^^^^^^ 

此外,由@melpomene指出的那样,pattern[0] == source[0]部分破裂,因为patternsource(但不能同时)可以在这一点上是空的。

最后,需要说的是递归方法在这里效率极低。

+0

谢谢你的回答NPE!即使它不是最快的答案,我仍然感谢你的回答! –

+0

除此之外,'pattern [0] == source [0]'部分也被破坏了。此时'pattern'或'source'可以为空。 – melpomene

+0

@melpomene:好了,谢谢! – NPE

0

你的意思

return match(pattern,source); 

否则,你得到了一个未定义的行为。

+0

多么愚蠢的错误,谢谢你,定了! –

1

你缺少你第二别的statment return语句:

if(pattern.size() == 0&& source.size() == 0) 
{ 
    return true; 
} 
else if(pattern[0] == source[0]) // no return statement. 
{ 
    pattern.erase(0,1); 
    source.erase(0,1); 
    return match(pattern,source); 
} 
else 
{ 
    cout << "false" << endl; 
    return false; 
} 
1

试试这个实施:

bool match(const string& pattern, const string& source) 
{ 
    int len = source.size(); 
    if (pattern.size() != len) 
    { 
     return false; 
    } 
    for (int i=0; i < len; ++i) 
    { 
     if (pattern[i] != source[i]) 
      return false; 
    } 
    return true; 
}