使用 C++ 的回文程序的不需要的输出
undesired output of the Palindrome program using C++
所以我两周前开始学习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或两个回文)即使字符串不是回文。
请向我解释我犯了什么错误以及如何纠正它们。另外,如果我想让我的程序处理一个有空格的字符串,我该怎么做?
有几个问题
-
您的代码循环次数过多。例如,一个由三个字母组成的单词应该循环三次,但你的代码循环 4(
i=0
、i=1
、i=2
和i=3
)。要解决此问题,您需要将最终条件更改为使用<
而不是<=
。 -
您正在使用错误的公式计算对称指数。例如,如果你有一个长度为三的单词,则字母是
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];
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么output_editor Concept不需要output_e迭代器标记
- 在除法中不需要四舍五入
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 将值从另一个数组写入数组,不包括不需要的值 C++
- C++ 写入路径名中包含不需要的空字符的文件
- C++:添加到输出中的不需要的数字
- 我的代码看起来不错,但某些输入会导致不需要的输出
- 使用 C++ 的回文程序的不需要的输出
- 不需要的输出
- 掷骰子(基于文本的RPG)C++不需要的数字和字母序列输出
- 不需要的输出重复和矩阵搜索问题
- Win32 键转换代码输出不需要的按键
- 不需要输出。为什么没有"gx+gy"输出?
- 开关不需要的输出
- 为什么我不需要解引用一个char指针来输出c风格的字符串?
- 如何输出x=y^x, y=x而不需要另一个变量
- 需要帮助干燥运行,不知道输出是如何的