找出给定的字符串是回文还是不是回文

我做了一个程序来查找输入的字符串是否是回文序列,但它总是说它不是回文

#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回文结构。 假设你有一个名为xstd::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; }