Ex5_12.cpp
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:2k
源码类别:

书籍源码

开发平台:

Visual C++

  1. //【例5.12】判断用户输入的字符串是否为回文。回文是指顺读和反读都一样的串,这里不分大小写,
  2. //并滤去所有非字母字符,如:Madam,I'm Adam.和Golf,No Sir,prefer prison flog!都是回文。
  3. #include<iostream>
  4. #include<string>
  5. #include<cctype>
  6. using namespace std;
  7. void swap(char&,char&);           //交换两个字符
  8. string reverse(const string&);     //返回反转的字符串
  9. string remove_punct(const string&,const string&);
  10.   //将第一个字符串中所包含的与第二个字符串中相同的字符删去
  11. string make_lower(const string&);  //所有大写改为小写
  12. bool is_pal(const string&);        //判断是否回文
  13. int main(){
  14. string str;
  15. cout<<"请输入需判断是否为回文的字符串,以回车结束。n";
  16. getline(cin,str);
  17. if(is_pal(str)) cout<<str<<"是回文。n";
  18. else  cout<<str<<"不是回文。n";
  19. return 0;
  20. }
  21. void swap(char& ch1,char& ch2){
  22. char temp=ch1;
  23. ch1=ch2;
  24. ch2=temp;
  25. }
  26. string reverse(const string& s){
  27. int start=0,end=s.length();
  28. string temp(s);
  29. while(start<end){
  30. end--;
  31. swap(temp[start],temp[end]);
  32. start++;
  33. }
  34. return temp;
  35. }
  36. string remove_punct(const string& s,const string& punct){
  37. string no_punct;                     //放置处理后的字符串
  38. int i,s_length=s.length(),p_length=punct.length();
  39. for(i=0;i<s_length;i++){
  40. string a_ch=s.substr(i,1);       //单字符string
  41. int location=punct.find(a_ch,0); //从头查找a_ch在punct中出现的位置
  42. if(location<0||location>=p_length)
  43. no_punct=no_punct+a_ch;//punct中无a_ch,a_ch拷入新串
  44. }
  45. return  no_punct;
  46. }
  47. string make_lower(const string& s){
  48. string temp(s);
  49. int i,s_length=s.length();
  50. for(i=0;i<s_length;i++) temp[i]=tolower(s[i]);
  51. return temp;
  52. }
  53. bool is_pal(const string& s){
  54. string punct("!,;:.?'" ");           //要滤除的非字母字符,包括空格符和常用标点符号
  55. string str(make_lower(s));
  56. str=remove_punct(str,punct);
  57. return str==reverse(str);
  58. }