gpt4 book ai didi

c - 回文仅在末尾比较标点符号,使用指针

转载 作者:行者123 更新时间:2023-11-30 16:39:07 25 4
gpt4 key购买 nike

这是我用c语言制作的回文检查器。它适用于所有输入,无论它们是否有标点符号,除非最后一项是标点符号。在这种情况下,它不会跳过它并进行比较,然后说它不是回文,而实际上它是。 EX(lived,devil。不会是回文,但lived,devil将是)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>

#define max 180

bool is_palindrome(const char *message);

int main()
{
char message[max+1];

printf("Enter a message: ");
gets(message);
if(!*message)
{
printf("input error");
return 0;
}

if (is_palindrome(message)) printf("Palindrome\n");
else printf("Not a palindrome");

return 0;
}

bool is_palindrome(const char *message)
{
char *p, *p2;
bool palindrome = true;

p = message;
p2 = message;

for(;;)
{
while(*p)p++;

while(*p2)
{
while(!isalpha(*p)) p--;
while(!isalpha(*p2)) p2++;

if (toupper(*p) != toupper(*p2))
{
palindrome = false;
break;
}else
{
p--;
p2++;
}

}
break;
}
return palindrome;
}

最佳答案

您的代码的主要问题在于以下几行 -

while(!isalpha(*p)) p--;
while(!isalpha(*p2)) p2++;

这会跳过所有非字母字符。这很好并且符合预期。但问题是,它还跳过了字符串终止符 \0

发生的情况是,随着 p2 继续前进,它到达字符串的末尾,它开始匹配末尾的 . 。它会跳过这一点,但也会跳过 \0。这会导致它读取超出字符串的内容(如果缓冲区在那里结束,这可能是未定义的行为)并产生错误的结果。

你需要做的是,如果p2到达末尾也停止。

因此将行更改为 -

while(!isalpha(*p)) p--;
while(*p2 != '\0' && !isalpha(*p2)) p2++;
if (*p2 == '\0')
break;

这些修改将使您的代码停止在正确的位置并解决您的错误。另外,for(;;) 和最后的无条件中断也是多余的。所以可以去掉。

DEMO在 Ideone 上。

关于c - 回文仅在末尾比较标点符号,使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47192467/

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