bool函数问题 - 总是返回true?

时间:2010-02-09 15:51:09

标签: c++ boolean

#include <iostream>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <cstdio>

using namespace std;

static bool isanagram(string a, string b);

int main(void)
{
    int i,n,j,s;
    cin >> n;
    string a, b;
    cin >> a >> b;
    if(!isanagram(a,b)) cout << "False" << endl;
    else cout << "True" << endl;
    return 0;


}

static bool isanagram(string a, string b)
{
    int i, j, size, s=0;
    size = a.size();
    bool k;
    for(i=0;i<size;i++)
    {
        k=false;
        for(j=0;j<size;j++)
        {
            if(a[i] == b[j]) { k = true; break; }
        }
        if(k==true) s+=1;
    }
    cout << a[2] << b[2] << endl;
    if(s == size) return true;
    else return false;

}

我不知道问题究竟在哪里,所以我只是粘贴了整个代码。

它应该是一个简单的程序,能够找到两个字符串是字谜,但它不起作用,我不知道为什么。我在程序中使用指针,所以认为可能是问题并删除它们,我另外删除了其他东西,但仍然无法正常工作。如果你可以看看 - 并告诉我一些我的代码可能出错的地方吗?

提前谢谢。

6 个答案:

答案 0 :(得分:3)

并不总是返回true:

这是我的意见:

0
sdf 
fda

这是我得到的输出:

fa 
False

关于你的任务:如果性能不是你的任务的问题,只需排序2个字符串(使用std :: sort)并比较结果。

关于你的风格:

  • 使用string :: length()而不是size() - 它更具惯用性
  • 而不是if(s == size) return true; else return false;考虑return s == size
  • 通过const引用传递您的字符串,而不是通过值传递
  • 考虑将变量声明为尽可能接近其使用点(但不是非常接近)并在声明时初始化它们(i,j,k,size都适合此提示)

答案 1 :(得分:3)

你的isanagram函数的逻辑存在致命的缺陷 - 它永远不会正常工作,即使你设法修复它中的错误。

在开始编码之前,您需要确保拥有正确的算法。一个简单的算法可能是:

  • 排序
  • 排序b
  • isanagram =(a == b)

答案 2 :(得分:2)

基本上有两种检查字谜的方法:

  1. 对两个字符串进行排序,看它们是否匹配。如果它们是字谜,它们将具有相同的字母,并且排序会将它们排序为相同的序列。

  2. 计算每个字符串中每个char的频率。如果它们是字谜,那么两个字符串的每个char的频率计数都是相同的。

答案 3 :(得分:2)

你的方法很好,但它有一个小缺陷。确保字符串a中的每个字符都存在于字符串中。因此,如果a =“aab”和b =“abc”,您的方法会将它们标记为字谜。您还需要计算帐户中的char数。

anagram的定义是:

  

anagram是一种文字游戏,是重新排列单词或短语的字母以产生新单词或短语的结果,使用所有原始字母完全一次;

许多人建议的最简单的方法是确保字符串具有相同的长度。如果是,请对两个字符串进行排序并检查是否相等。

如果要修补方法,可以在字符串a中的字符匹配后将字符串b中的字符串设为NULL。

类似的东西:

if(a[i] == b[j]) { b[j] = 0; k = true; break; }

代替你:

if(a[i] == b[j]) { k = true; break; }

这样一旦b的char匹配,它就不能再次参与。

答案 4 :(得分:0)

我发现您的代码存在一些问题。基本上算法是错误的。它将匹配a.size()中的字符。它不需要重复(在a或b中)。

基本上,您应该对字符串进行排序,然后比较相等性。

如果无法排序,至少从比较中删除b个字符,请删除k变量。

答案 5 :(得分:0)

首先要做的事情是:不要声明方法static。考虑到它可以实现的所有角色,它在最好的时候是一个令人困惑的关键字...所以保留你真正需要的时间(例如,类的方法或属性没有绑定到任何实例)。

关于算法:你几乎就在那里,但只有存在是不够的,你需要考虑帐户中的字符数。

我们干脆就这样做:

bool anagram(std::string const& lhs, std::string const& rhs)
{
  if (lhs.size() != rhs.size()) return false; // does not cost much...

  std::vector<int> count(256, 0); // count of characters
  for (size_t i = 0, max = lhs.size(); i != max; ++i)
  {
    ++count[lhs[i]];
    --count[rhs[i]];
  }

  for (size_t i = 0, max = count.size(); i != max; ++i)
    if (count[i] != 0) return false;

  return true;
} // anagram

我们在工作中看到它:anagram("abc","cab")

  1. 初始化:count = [0, 0, ...., 0]
  2. 第一个循环i == 0&gt; ['a': 1, 'c': -1]
  3. 第一个循环i == 1&gt; ['a': 0, 'b': 1, 'c': -1]
  4. 第一个循环i == 2&gt; ['a': 0, 'b': 0, 'c': 0 ]
  5. 第二个循环没有任何问题。

    变体包括维护2个计数数组(每个字符串一个),然后比较它们。效率略低......但这并不重要。

    int main(int argc, char* argv[])
    {
      if (argc != 3) std::cout << "Usage: Program Word1 Word2" << std::endl;
      else std::cout << argv[1] << " and " << argv[2] << " are "
                     << (anagram(argv[1], argv[2]) ? "" : "not ")
                     << "anagrams" << std::endl;
    }