为什么我的回文检查功能总是返回错误的回文?

时间:2016-10-06 16:33:22

标签: c string palindrome sentence

我正试图检查句子是否是回文。空格和标点符号都不重要。

示例:

•从不奇怪甚至

•一名男子计划运河巴拿马。

•门卫看到名字,车库看到名牌

这句话的Netheir在我的代码中传递了。 在我的第一次尝试删除空格,标点符号并转换较低的字母。

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;
}

3 个答案:

答案 0 :(得分:3)

第4行:您希望按sizeof获取元素数。

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

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

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

  n = strlen(str)

(需要#include <string.h>)如果它是c。

中的字符串格式

答案 1 :(得分:0)

好的,现在进行了所有修改。谢谢你们。

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

while(str[i]!= '\0'){
  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;
}

答案 2 :(得分:0)

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

int palindrome(char *str)
{
    int i = 0, j = strlen(str);
    while (i < j)
    {
        if (str[j] == '\0' || !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;
}