使用 C++ 的回文程序的不需要的输出

undesired output of the Palindrome program using C++

本文关键字:不需要 输出 程序 回文 C++ 使用      更新时间:2023-10-16

所以我两周前开始学习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");
}

输出始终为:是回文1(在"回文"末尾有1或两个回文)即使字符串不是回文。

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

有几个问题

  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进行索引。

这两个错误在

编程中都很常见,它们被称为"逐一关闭"错误。请记住,在编写代码时始终仔细检查边界条件,以便将此类错误远离程序。

对于第一个,您需要更改

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

程序的行为将在以下行之后变为未定义:

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

由于长度总是 1 加上最后一个元素(因为第一个索引为),当i 0 时,则:word[word.length()] 会在最后一个元素之后给你元素,这是不可能的,因此你的程序将调用自 C/C++ 以来的未定义行为...... 当i本身变得word.length()时,word[word.length()]也是可能的,所以将<=(小于或等于)更改为<(小于)

所以,它应该是:

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