布尔函数返回24,并且在多个编译器中表现不一致



好吧,这简直要把我逼疯了,我不知道这是怎么回事。我为学校编写了一些代码,它接受一个字符串,一个起始和结束索引,如果字符串是回文,则输出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)

最新更新