标签:span std rom lin eve har ring clu 返回
题目:
编写函数
int palindrom( char *string);
如果参数字符串是个回文,函数就返回真,否则就返回假。回文就是指一个字符串从左向右读和从右向左读是一样的。函数应忽略所有的非字母字符,而且在进行字符比较时不用区分大小写。
前提是空白字符、标点符号和大小写状态被忽略,当Adam第1次遇到Eve时他可能会说的一句话:“Madam,I‘m Adam”就是回文一例。
分析题目,题目中没有规定空字符串和全是非字母字符的情况是否属于回文,我私自将空字符串归为回文,将全是非字母字符归为非回文,palindrom函数的编码实现思路如下:
使用指针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 }
标签:span std rom lin eve har ring clu 返回
原文地址:https://www.cnblogs.com/jingliang10101/p/9804652.html