好吧,这简直要把我逼疯了,我不知道这是怎么回事。我为学校编写了一些代码,它接受一个字符串,一个起始和结束索引,如果字符串是回文,则输出true,如果不是,则输出false。我添加了一些额外的东西,以确保如果你给它一个有空格和标点的句子,它能工作,除了一个小的逻辑错误,如果中间两个字母不同,它会返回真值,它能工作.....几乎。它有一个超级有趣的错误,它似乎在不同的编译器上表现不同。repl。它,我得到一个stack smash detected
消息基本上任何输入,但对于一些事情,像输入Hello, World!
,我得到一个分割错误。当我在Visual studio 2019上运行它时,它为每个错误输入返回24,我甚至不知道布尔值如何返回像24这样的东西,但是如果我将函数从bool
类型更改为int
类型,那么它就可以完美地工作....除了回复。它,在那里我仍然得到堆栈粉碎。我也不想把它留在一个int然后就结束了,因为那感觉就像一个创可贴,到底发生了什么?
tldr;布尔函数在Visual studio上返回24,而在其他地方返回堆栈粉碎,将函数返回类型更改为int而不是bool在Visual studio上修复了它,但不适用于其他。
#include <iostream>
#include <string>
using namespace std;
bool isPalindrom(string, int, int);
int main() {
string str = "R aceCar";// should return true
bool thing = isPalindrom(str,0,str.length()-1);
cout << thing << endl;
}
bool isPalindrom(string str, int start, int end){
if(end - start == 1 && (tolower(str[start]) == tolower(str[end])) || start == end){
return 1;
}
else{
if((str[start] >= 'a' && str[start] <= 'z') || (str[start] >= 'A' && str[start] <= 'Z')){
if((str[end] >= 'a' && str[end] <= 'z') || (str[end] >= 'A' && str[end] <= 'Z')){
if(tolower(str[start]) == tolower(str[end])){
// cout << str[start] << ' ' << str[end] <<endl;
isPalindrom(str, start+1, end-1);
}
else{
return 0;
}
}
else{
isPalindrom(str, start, end -1);
}
}
else{
isPalindrom(str, start+1, end);
}
}
}
你没有从isPalindrom返回一个值,你的编译器肯定会警告你,我的编译器就是这样做的
1>C:workConsoleApplication1ConsoleApplication1.cpp(68):警告C4715: 'isPalindrom':并非所有控件路径返回值
你可能——这是你的逻辑——只是想
if (tolower(str[start]) == tolower(str[end])) {
// cout << str[start] << ' ' << str[end] <<endl;
return isPalindrom(str, start + 1, end - 1); <<<<===
}
else {
return 0;
}
}
else {
return isPalindrom(str, start, end - 1); <<<<====
}
}
else {
return isPalindrom(str, start + 1, end); <<<<====
}
通过这些编辑,你的代码现在显示为0 -我认为这意味着"R "不是回文
这个也应该是
bool isPalindrome()
pm100的答案就是你所寻求的指导。但是我发现的另一个小错误是在函数开始处的退出检查:
if(end - start == 1 || start == end){
return 1;
}
考虑当您有这个简单的测试时会发生什么:
string str = "AB";// should return false
int thing = isPalindrom(str,0,str.length()-1);
cout << thing << endl;
正如您现在所编码的那样,isPalindrom
将返回1,但您真正希望它返回0,因为"AB"
不是回文。
有一个非常简单的修复方法。如果你必须为那个边缘情况编写复杂的解决方案,那你就错了。如果你没有看到快速解决办法,请告诉我,我会提供另一个提示。
为了使你的递归更有效,你可以避免复制通过将str
作为const引用传递给每个递归:
int isPalindrom(const string& str, int start, int end)