为什么我的回文检查函数总是 return false for palindromes?

Why does my palindrome checking function always return false for palindromes?

我正在尝试检查一个句子是否为回文。 space 和标点符号都不重要。

示例:

• 从不奇数或偶数

• 一个人计划一条运河巴拿马。

• 看门人看名字,车库看门人

在我的代码中,这些句子都没有通过。 在我的第一次尝试中,我尝试删除 spaces、标点符号并将大写字母转换为小写字母。

int palindrome(char *str){
    int n,n2 = 0,i,j=0;
    n = sizeof(str)/sizeof(char);
    char nova[n];

    for (i=0;i< n;i++){
        if(str[i] >= 'A' && str[i] <= 'Z'){
            nova[n2] = ('a' + str[i] - 'A');
            n2++;
        }
        else if(str[i] >= 'a' && str[i] <= 'z'){
            nova[n2] = str[i];
            n2++;
        }
    }

    i=0;
    while (i < n2-1){
        if (nova[i]!= nova[j]){
            return 0;
        }
        i++;
        j--;
    }

    return 1;
}

第 4 行:您想通过 sizeof.

获取元素的数量

但是如果你通过指针将参数传递给函数。

  n = sizeof(str)/sizeof(char);

n 将始终为 4(在 32 位平台上)。相反,使用

  n = strlen(str)

(需要#include <string.h>)如果是c中的字符串格式

好的,现在所有的修改都可以使用了。谢谢大家。

int palindrome(char *str)
{
int n =0,i=0,j;
char nova[100];

while(str[i]!= '[=10=]'){
  if(str[i] >= 'A' && str[i] <= 'Z'){
         nova[n] = ('a' + str[i] - 'A');
         n++;
  }
  else if(str[i] >= 'a' && str[i] <= 'z'){
         nova[n] = str[i];
         n++;
  }
  i++;
}

i=0;
j= n-1;
while (i< j){
    if (nova[i]!= nova[j]){
        return 0;
    }
    i++;
    j--;
}

return 1;
}

现有的答案很好,但还有另一种方法可以解决这个问题,无需使用额外分配的内存。您实际上不需要将字母存储在任何地方以进行比较 - 您可以使用指向原始字符串的指针。

int palindrome(char *str)
{
    int i = 0, j = strlen(str);
    while (i < j)
    {
        if (str[j] == '[=10=]' || !isalpha(str[j]))
            --j; // skip the character on the right if it's not a letter
        else if (!isalpha(str[i]))
            ++i; // skip the character on the left if it's not a letter
        else if (tolower(str[i]) != tolower(str[j]))
            return 0; // letters are different? - not a palindrome
    }
    // all letters were equal? - a palindrome
    return 1;
}