回文测试仪具有逻辑缺陷

时间:2013-09-27 01:21:20

标签: c++

这只是我的C ++类的基本回文测试程序,似乎存在问题。

我已经知道我在这里有两个独立的缺陷。我强烈怀疑,至少有一个是逻辑问题。第一个问题是它在第一次运行时运行良好,但是当循环启动时,它不会要求用户输入放入一个新行来测试作为回文,它只是重新测试旧的。第二个问题是,我认为它是在测试空间,我根据这个事实,即它让'hannah'恢复良好,但'从来没有甚至或奇怪'都回来了。这个我只是不知道如何解决。

#include <iostream>
#include <string>

using namespace std;

int main()
{
  bool repeater = true;
  do
    {
      string palindroneCheck;
      bool palindronity = true;

      cout << "Please enter a line to test for palindromity.\n";
      getline(cin, palindroneCheck);

      int stringSize = palindroneCheck.size();
      int cutOff = stringSize/2;

      for (int palindroneLength = 0; palindroneLength < cutOff; palindroneLength++)
        {
          if (palindroneCheck[palindroneLength] != palindroneCheck[stringSize - palindroneLength -1])
            {palindronity = false;
              break;}
        }

      if(palindronity == true)
        cout << "Congratulations! This line is a palindrone!\n\n";
      else
        cout << "Sorry, but this is not a palindrone.\n\n";

      palindroneCheck.clear();

      char repeat;
      cout << "Would you like to try another line? Y/N\n";
      cin >> repeat;
      if (repeat == "n" || repeat == "N")
        repeater = false;
    } while (repeater == true);

}

2 个答案:

答案 0 :(得分:1)

好的,你对这个空间是正确的。您的代码将要求空格与其他角色一样位于同一位置。

另一个错误似乎更微妙:它是你要求重复的地方。

为什么呢?因为它要求你输入'n'然后'输入'

cin >> repeat只读取'n',而不是'enter'

所以下次你做`readline(cin,PalindromCheck)时,它会读取一个空字符串。

在阅读之后尝试写palindromCheck。你会看到。

答案 1 :(得分:0)

getline的阅读问题通过评论解决。对于空白,您可以通过删除字符串palindroneCheck

中的所有空格来解决它
std::string::iterator new_end = std::remove(palindroneCheck.begin(), palindroneCheck.end(), ' ');
std::string palindroneCheckWithoutSpaces(palindroneCheck.begin(), new_end);

然后使用palindroneCheckWithoutSpaces进行Palindrone测试。

  int stringSize = palindroneCheckWithoutSpaces.size();
  int cutOff = stringSize/2;

  for (int palindroneLength = 0; palindroneLength < cutOff; palindroneLength++)
    {
      if (palindroneCheckWithoutSpaces[palindroneLength] != palindroneCheck[stringSize - palindroneLength -1])
        {palindronity = false;
          break;}
    }

  if(palindronity == true)
    cout << "Congratulations! This line is a palindrone!\n\n";
  else
    cout << "Sorry, but this is not a palindrone.\n\n";

(您需要标题algorithm才能使用remove

更新

std::remove根据您传入的值从输入范围中删除一个元素(这由start和end定义),这里是空格' '。然后它返回更改范围的新结束(因为您删除了某些内容,范围变小)。新范围以begin开头,以返回值结束。

所以第二行你根据新范围创建一个新字符串。