標籤:span std rom lin eve har ring clu 返回
題目:
編寫函數
int palindrom( char *string);
如果參數字串是個迴文,函數就返回真,否則就返回假。迴文就是指一個字串從左向右讀和從右向左讀是一樣的。函數應忽略所有的非字母字元,而且在進行字元比較時不用區分大小寫。
前提是空白字元、標點符號和大小寫狀態被忽略,當Adam第1次遇到Eve時他可能會說的一句話:“Madam,I‘m Adam”就是迴文一例。
分析題目,題目中沒有規定Null 字元串和全是非字母字元的情況是否屬於迴文,我私自將Null 字元串歸為迴文,將全是非字母字元歸為非迴文,palindrom函數的編碼實現思路如下:
- 當 strlen(string) <= 1。如果string的長度為0,則返回true;如果string的長度為1,如果是字母字元,返回true;否則返回false。
- 當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 else16 {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 else35 {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 else69 {70 return false;71 }72 }73 else74 {75 if((*p == *str) || (*p == *str + 32))76 {77 ++str;78 --p;79 }80 else81 {82 return false;83 }84 }85 }86 }
C和指標--編程題9.14第10小題--判斷迴文函數