1. 程式人生 > >C和指標--程式設計題9.14第10小題--判斷迴文函式

C和指標--程式設計題9.14第10小題--判斷迴文函式

題目:

編寫函式

  int palindrom( char *string);

如果引數字串是個迴文,函式就返回真,否則就返回假。迴文就是指一個字串從左向右讀和從右向左讀是一樣的。函式應忽略所有的非字母字元,而且在進行字元比較時不用區分大小寫。

前提是空白字元、標點符號和大小寫狀態被忽略,當Adam第1次遇到Eve時他可能會說的一句話:“Madam,I'm Adam”就是迴文一例。

分析題目,題目中沒有規定空字串和全是非字母字元的情況是否屬於迴文,我私自將空字串歸為迴文,將全是非字母字元歸為非迴文,palindrom函式的編碼實現思路如下:

  1. 當 strlen(string) <= 1。如果string的長度為0,則返回true;如果string的長度為1,如果是字母字元,返回true;否則返回false。
  2. 當strlen(string) >=2。

使用指標p指向字串末尾,從兩端(string指標從前到後,p指標從後向前)比較字母字元,*string和*p在都是字母字元的情況下,要麼是相等關係,要麼是大小寫關係,一旦不符合迴文條件則立馬返回false。

根據思路編寫程式碼如下,並使用“Madam,I'm Adam”通過了測試。

 1 #include<iostream>
 2 #include<string.h>
 3 const static int BUFF_SIZE = 50;
 4 bool palindrome(char * str);
5 int main(int argc, char *argv[]) 6 { 7 char str[BUFF_SIZE]; 8 std::cout<<"enter a char[]: "<<std::endl; 9 std::cin.getline(str, BUFF_SIZE); 10 std::cout<<"str: "<<str<<std::endl; 11 if(palindrome(str)) 12 { 13 std::cout<<"\""<<str<<"
\" is a palindrome\n"; 14 } 15 else 16 { 17 std::cout<<"\""<<str<<"\" is not a palindrome\n"; 18 } 19 return 0; 20 } 21 bool palindrome(char * str) 22 { 23 if(strlen(str) == 0) 24 { 25 std::cout<<"it is a null string\n"; 26 return true; 27 } 28 if(strlen(str) == 1) 29 { 30 if(isalpha(*str)) 31 { 32 return true; 33 } 34 else 35 { 36 std::cout<<"it has no alpha\n"; 37 return false; 38 } 39 } 40 char * p = str; 41 while('\0' != *(++p)) 42 { 43 // p++; 44 } 45 p--; 46 while(str < p) 47 { 48 while(!isalpha(*str)) 49 { 50 if('\0' == *str) 51 { 52 std::cout<<"it has no alpha\n"; 53 return false; 54 } 55 ++str; 56 } 57 while(!isalpha(*p)) 58 { 59 --p; 60 } 61 if(islower(*str)) 62 { 63 if((*p == *str) || (*p == *str - 32)) 64 { 65 ++str; 66 p--; 67 } 68 else 69 { 70 return false; 71 } 72 } 73 else 74 { 75 if((*p == *str) || (*p == *str + 32)) 76 { 77 ++str; 78 --p; 79 } 80 else 81 { 82 return false; 83 } 84 } 85 } 86 }