我正试图检查句子是否是回文。空格和标点符号都不重要。
示例:
•从不奇怪甚至
•一名男子计划运河巴拿马。
•门卫看到名字,车库看到名牌
这句话的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;
}
答案 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;
}