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 }

 

转载于:https://www.cnblogs.com/jingliang10101/p/9804652.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值