gpt4 book ai didi

C++ 递归和指针问题

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:42 26 4
gpt4 key购买 nike

首先,这是一项作业。

要求:

1.Take in string input
2. copy string (stripping out white space, punctuation, and
covert all characters to uppercase in the process)
3. Then determine if this copied string is a palindrome.

判断回文所需的方法:

Base Case:  string length is <= 1
General Case: if first letter != last letter, false, otherwise
point to next letter and write '\0' to last letter and
call the method again

例如:

RACECAR\0   R==R
ACECA\0 A==A
CEC\0 C==C
E\0 E <= 1 TRUE!

我无法让我的 isPalindrome 函数正常工作。据我所知,其他一切都很好。我真的认为问题出在我的递归调用上。我已经调试了 2 天了,我无法弄清楚为什么返回错误。任何帮助将不胜感激。我不是在找人帮忙,也许只是想多看看这段代码。谢谢。

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

int charCount(char * copy)
{
int count = 0;

for (int i = 0; copy[i] != '\0'; i++)
{
count++;
}

return count;
}

bool isPalindrome(char *copy)
{
bool result = false;
int size = charCount(copy);

char * last = &copy[size - 1];

if (size <= 1)
{
result = true;
}

if (copy != last)
{
result = false;
}

else
{
++copy;
last = '\0';
isPalindrome(copy);
}

return result;
}

void stringCopy(char * source, char * destination)
{
int sourceIndex = 0;
int destIndex = 0;

while (source[sourceIndex] != '\0')
{
while (!(isalnum(source[sourceIndex])) && source[sourceIndex] != '\0')
{
sourceIndex++;
}

if (source[sourceIndex] == '\0')
{
break;
}

if (isalpha(source[sourceIndex]))
{
destination[destIndex] = toupper(source[sourceIndex]);
}

if (isdigit(source[sourceIndex]))
{
destination[destIndex] = source[sourceIndex];
}

sourceIndex++;
destIndex++;
}

destination[destIndex] = '\0';
}

int main()
{
string input = "";

cout << "Enter a string: ";
getline(cin, input);

char * source = &input[0];
int sourceSize = charCount(source);

char * copy = new char[sourceSize];

stringCopy(source, copy);

int copySize = charCount(copy);

if (isPalindrome(copy))
{
cout << input << " is a palindrome!" << endl;
}

else
{
cout << input << " is not a palindrome" << endl;
}

return 0;
}

最佳答案

四个错误

首先你有三个案例,但你只想执行一个,所以它应该是一个单一的 if ... else if ... else ... 语句,而不是 if ... if ... else ... 您拥有的语句。

其次,您的比较不正确,因为您比较的是指针而不是它们指向的字符。

第三个错误与第二个类似,当您尝试缩短分配给指针而不是字符的字符串时。

最后,您忘记了将递归调用的结果分配给您的 result 变量。相当常见的新手错误。

这是我的努力(未经测试的代码)

bool isPalindrome(char *copy)
{
bool result = false;
int size = charCount(copy);

char * last = &copy[size - 1];

if (size <= 1)
{
result = true;
}
else if (*copy != *last) // else if and *copy != *last, not copy != last
{
result = false;
}
else
{
++copy;
*last = '\0'; // *last not last
result = isPalindrome(copy); // capture return value from recursive call
}

return result;
}

一个函数中的四个错误可能看起来很多,但这些都是很容易修复的愚蠢错误。整体代码质量相当不错。

现在为了加分,看看您是否可以编写一个不会破坏字符串的版本。因为您分配了 *last = '\0',所以您在工作时更改了字符串。

关于C++ 递归和指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54939970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com