【问题标题】:Strange bool returing behavior奇怪的布尔返回行为
【发布时间】:2012-12-01 17:38:17
【问题描述】:

我正在尝试使用我创建的bool match(string,string) 逐个字符地比较两个字符串,我相信当我输入两个不相等的字符串时它会正确比较,它会输出假!但是当我检查 bool 时,它没有返回 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;
    }
}

【问题讨论】:

    标签: c++ boolean compare return


    【解决方案1】:

    你是说

    return match(pattern,source);
    

    否则你会得到未定义的行为。

    【讨论】:

      【解决方案2】:

      你忘记了return

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

      另外,正如@melpomene 所指出的,pattern[0] == source[0] 部分已损坏,因为此时patternsource(但不能同时为空)可能为空。

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

      【讨论】:

      • 感谢您的回答 NPE!尽管这不是最快的答案,但我仍然感谢您的回答!
      • 除此之外,pattern[0] == source[0] 部分也损坏了。 patternsource 此时可以为空。
      • 恐怕递归是强制性的,我的目标是完全比较两个字符串,这意味着如果一个为空而另一个字符串不是,它们就不一样了。还是只有我一个人?
      • @EliantenHolder:完全正确。问题是你没有正确处理这个案子。一旦你用尽了较短的字符串,pattern[0]source[0] 将是未定义的。第一个if 将评估为false,而pattern[0] == source[0] 将导致未定义的行为。
      • @NPE 您建议如何解决这个问题?在比较之前检查字符串的长度?
      【解决方案3】:

      您在第二个 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;
      }
      

      【讨论】:

        【解决方案4】:

        试试这个实现:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-09
          • 2014-09-01
          • 2021-12-31
          • 2019-01-24
          相关资源
          最近更新 更多