为什么我的回文检查函数总是 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;
}
我正在尝试检查一个句子是否为回文。 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;
}