gpt4 book ai didi

c - C 中回文函数的意外输出

转载 作者:太空宇宙 更新时间:2023-11-04 00:51:00 24 4
gpt4 key购买 nike

我写了这个函数 isPalindrome,它的目的是从一个单独的函数中获取一个字符串输入,如果它是一个回文,则返回 1,否则返回 0。输入可以是任何字符,并且可以包含大写字母,该函数旨在对这些字符进行排序,并纯粹根据字母字符检查它是否是回文。

我已经研究了一段时间,但我不知道出了什么问题,整个函数在下面,但我无法理解它给我的输出,有时它会完全跳过最后一个 else声明,并停止循环,我不知道为什么。当连续输入两个非字母字符时,变量 a 或 b 不会递增两次,而是将其发送到最后一个 else 语句并返回不正确的值。

我也尝试在不将任何信息复制到单独的数组中的情况下编写此函数。

int isPalindrome(char s[])
{
int logic;
int a = 0;
int b = 0;
int num = 0;
int count = 0;

while ( s[b]!='\0' )
{
if ( isalpha(s[b]) != 0 )
{
num++;
}
b++;
}

b = b - 1;

printf("The number of characters is: %d\n", b);
printf("The number of alpha characters is: %d\n", num);

while ( count < num/2 )
{

if ( !isalpha(s[a]) || s[a] == ' ')
{
a++;
}
else
{
count++;
}
if ( !isalpha(s[b]) || s[b] == ' ')
{
b--;
}

if ( toupper(s[a]) == toupper(s[b]) )
{

printf("s[%d]: %c | s[%d]: %c\n", a, toupper(s[a]), b, toupper(s[b]));

a++;
b--;

if ( a == b )
{
logic = 1;
}
}
else
{
logic = 0;
break;
}
}

return logic;
}

最佳答案

您似乎希望您的回文测试器只考虑字母字符,而忽略大小写。如果是这样,那么你的程序逻辑是错误的。

你有 ab作为字符串的索引,其中 a从头开始 b从末尾开始。与其计算你必须做的测试数量,我认为最好只设置 b到最后,开始你的工作循环。只要 a < b 循环就会继续是真的:

int a = 0;
int b = strlen(s) - 1;

while (a < b)
{

在你的循环中,你应该递增 a如果s[a]不是字母,递减b如果s[b]不是字母,只要a继续小于 b .

    while (a < b && !isalpha(s[a]))
{
++a;
}
while (a < b && !isalpha(s[b]))
{
--b;
}

如果调整后,a仍然小于b ,那么我们可以比较s[a]s[b] , 不考虑大小写。如果它们不相等,则该字符串不是回文,因此我们可以跳出循环。否则,a递增,b递减,循环继续回到顶部:

    if (a < b &&  toupper(s[a]) != toupper(s[b]))
{
break;
}
++a;
--b;
}

如果循环结束并且a < b仍然为真,这意味着 toupper(s[a]) != toupper(s[b]) ,所以这个字符串不是回文,我们可以返回 false。否则就是回文。所以该函数可以返回该事实:

if (a < b)
{
return false;
}
else
{
return true;
}
// or more succinctly: return !(a < b);

关于c - C 中回文函数的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18777391/

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