找出给定的字符串是回文还是不是回文
我做了一个程序来查找输入的字符串是否是回文序列,但它总是说它不是回文
#include #include #include void main(void) { int i,len,halflen,flag=1; char str[50]; clrscr(); printf("Enter a string:\n"); gets(str); len=strlen(str); halflen=len/2; for(i=0;i<halflen;i++) { if(str[i]!=str[i+halflen]) flag=0; break; } if(flag) printf("It is a Palindrome."); else printf("It is not a Palindrome."); getch(); }
你的中心比较是有缺陷的:
if (str[i] != str[i+halflen])
这不是比较你认为的两个字符。
尝试在你的程序中输入“HelloHello”,它会说它是一个回文!
你需要比较这两个:
if (str[i] != str[len-i-1])
(并修复大括号,如另一个答案所示)
为了给你一个线索,我已经做了一些更整洁的代码缩进:
for(i=0;i
您还可以使用STL来检查给定字符串是否是使用函数equal
回文结构。 假设你有一个名为x
的std::string
,那么下面的函数调用确定x是否是回文
equal(x.begin(), x.begin() + x.size() / 2, x.rbegin());
在这里你需要像…
if(str[i]!=str[strlen (str) - i - 1]) { flag = 0; break; }
break
需要进入if
块,否则它将始终执行。 在某些时候初始化flag
也是一个好主意。 如果允许我进行观察,即使只有一个语句,也总是将if-block和else括在大括号中; 它会省去你在这里遇到的几个问题。
后来 – 根据Rodriguez先生的评论编辑如下。
从我自己的2005版本 :
bool isAlphaNumeric(char c) { return (iswalpha(c) || iswdigit(c)); } bool isPalindrome(char *str) { /* A man, a plan, Anal Panama!!! */ if(*str == '\0') { return false; } int len = strlen(str); if(len <= 1) return true; char *start = str; char *end = start + len - 1; while(start < end) { if(!isAlphaNumeric(*start)) { *start++; continue; } if(!isAlphaNumeric(*end)) { *end--; continue; } if(towlower(*start) != towlower(*end)) { return false; } *start++; *end--; } return true; }
bool isPalindrome(char* str) { char* s = str; char* e = str; while(*e) e++; --e; while(s < e) { if(*s != *e) return false; ++s; --e; } return true; }