使用C ++的Palindrome程序的不良输出

时间:2019-02-03 08:40:37

标签: c++ string palindrome

所以我两周前开始学习C ++,我想构建一个程序来检查字符串是否是回文。 我尝试通过以下方式尝试不同的方式,包括str1 == str2方法:

#include<iostream>
#include<string>
using namespace std;

string empty;
string word;
bool inverse(string word)
{

    for (int i=0;i<=word.length();i++)
    {
         empty+=word[word.length()-i];
    }
    return empty==word;
}

int main()
{ 

    cout<<inverse("civic");

}

输出始终为0

第二种方式:str1.compare(str2)方法

#include<iostream>
#include<string>
using namespace std;

string empty;
string word;
bool inverse(string word)
{

for (int i=0;i<=word.length();i++)
{empty+=word[word.length()-i];}

if (word.compare(empty))
return true;
else
return false;


}

int main()
{ 

if (inverse(word)==true)
cout<<"is a palindrome";
else
cout<<"is not a palindrome";
cout<<inverse("ano");
cout<<inverse("madam");
}

输出始终为:是palindrome1(“ palindrome”末尾带有1或2) 即使该字符串不是回文。

请向我解释我犯了什么错误以及如何纠正它们。 另外,如果我想让程序处理包含空格的字符串,该怎么办?

3 个答案:

答案 0 :(得分:2)

有几个问题

  1. 您的代码循环太多次。例如,三个字母的单词应循环三次,但是您的代码循环4(i=0i=1i=2i=3)。要解决此问题,您需要将最终条件更改为使用<而不是<=

  2. 您正在使用错误的公式计算对称索引。例如,如果您有一个长词,则三个字母为word[0]word[1]word[2]。但是,您的代码使用length - i,对于i=0,这将使用超出该单词允许限制的word[3]。您需要使用公式length - 1 - i而不是length - i进行索引。

这两种错误在编程中都很常见,它们被称为“一对一”错误。请记住,在编写代码时始终要仔细检查边界条件,以使此类错误远离您的程序。

答案 1 :(得分:1)

对于第一个,您需要更改

for (int i=0;i<=word.length();i++)
{empty+=word[word.length()-i];}

对此

for (int i=0;i<word.length();i++)
{empty+=word[word.length()-(i+1)];}

答案 2 :(得分:0)

此行之后,您的程序的行为将变得不确定:

for (int i = 0;i <= word.length(); i++)
    empty += word[word.length() - i];

由于 length 总是加最后一个元素(因为第一个索引为),当i为{ {1}},然后:0将为您在最后一个元素之后的 元素,这是不可能的,因此您的程序将调用未定义的行为,因为C / C ++ ... {当word[word.length()]本身变为word[word.length()]时也可以使用1}},因此请将i(小于或等于)更改为word.length()(小于)

因此,应该是:

<=