0

私が作成した を使用して 2 つの文字列を文字ごとに比較しようとしbool match(string,string)ています。互いに等しくない 2 つの文字列を入力すると正しく比較され、false が出力されると思います。しかし、ブールをチェックすると、falseが返されませんでした。この動作の理由が思い浮かびません。誰かが私を助けてくれることを願っています。コード:

#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;
    }
}
4

4 に答える 4

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;
}
于 2012-12-13T19:23:13.910 に答える
1

あなたは忘れましreturn

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

また、@melpomene が指摘したように、この時点でor (両方ではない) が空になる可能性があるpattern[0] == source[0]ため、パーツが壊れています。patternsource

最後に、再帰的アプローチはここでは非常に非効率的であると言う必要があります。

于 2012-12-13T18:57:06.747 に答える
1

2 番目の else ステートメントに 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;
}
于 2012-12-13T18:58:04.113 に答える
0

あなたが意味した

return match(pattern,source);

そうしないと、未定義の動作が発生します。

于 2012-12-13T18:56:58.660 に答える