我编写了一个用strrev()
函数反转数组的程序,并检查它的值是否与原始数据匹配,类似于回文。值匹配时,会打印Palindrome
,否则为Not a palindrome
。
但是当我比较它们并且值不匹配时,它仍会打印Palindrome
。
以下是代码:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <string.h>
#define MAX_LEN 100
void palindrom(char string[]);
int main()
{
char string[MAX_LEN] = { 0 };
printf("Enter string (max length 100 chars): ");
fgets(string, MAX_LEN, stdin);
if(string[strlen(string)-1] == '\n') { string[strlen(string)-1] = 0; }
palindrom(string);
return (0);
}
void palindrom(char string[])
{
int check = 0;
check = strcmp(strrev(string), string);
if (check == 0)
{
printf("Palindrome");
}
else
{
printf("Not a palindrome");
}
}
我的问题是什么?感谢。
答案 0 :(得分:4)
据我所知,strrev
也可以修改原始字符串,因此您需要复制它。
答案 1 :(得分:2)
关键是strrev
。
这是C中的一个程序,可以执行您正在测试的内容:
#include <stdio.h>
#include <string.h>
int main()
{
char a[100], b[100];
printf("Enter the string to check if it is a palindrome\n");
fgets(a, 100, stdin);
strcpy(b,a);
strrev(b);
if (strcmp(a,b) == 0)
printf("Entered string is a palindrome.\n");
else
printf("Entered string is not a palindrome.\n");
return 0;
}
答案 2 :(得分:1)
由于其他人已经澄清了问题所在,我想指出检查s [0] == s [len-1],s [1] == s [len-2]会更快,直到检查了字符串的一半(向上舍入)。
这不需要额外的内存,没有副本和一半的比较。 有点像:
void palindrom(char string[])
{
int len = strlen(string) - 1;
int i, limit = len/2 + (len % 2);
for (i = 0; i < limit; i++){
if (string[i] != string[len-i]){
printf("Not a palindrome\n");
return;
}
}
printf("Palindrome\n");
}
答案 3 :(得分:1)
您的功能失败,因为strrev
修改了字符串。您实际上总是将反转的字符串与自身进行比较。
这是一个不修改字符串的替代函数:
void palindrom(const char *str) {
for (size_t i = 0, j = strlen(str); i < j; i++, j--) {
if (str[i] != str[j - 1]) {
printf("Not a palindrome\n");
return;
}
}
printf("Palindrome\n");
}
答案 4 :(得分:0)
您不需要使用strrev
来测试回文,以下功能检测回文就好了,而不使用非标准C函数:
int ispalindrome(char *str, int len)
{
char *p = &str[0];
char *q = &str[len - 1];
do
{
if(p >= q)
{
return 1;
}
} while (*p++ == *q--);
return 0;
}